C# 使用构造函数选择和命名类型向Autofac注册泛型类型
我的“工作者类”需要向预定义构造函数注册,因为构造函数注入需要解析命名参数 在过去,我以这种方式注册了此工作人员类型:C# 使用构造函数选择和命名类型向Autofac注册泛型类型,c#,generics,inversion-of-control,autofac,registration,C#,Generics,Inversion Of Control,Autofac,Registration,我的“工作者类”需要向预定义构造函数注册,因为构造函数注入需要解析命名参数 在过去,我以这种方式注册了此工作人员类型: builder.Register<SomeWorker>( ctx => new SomeWorker( ctx.ResolveNamed<ICentralLogger>("GlobalLog"), ctx.ResolveNamed<ICentralLogger>("WorkerLog"), ctx.Resol
builder.Register<SomeWorker>(
ctx => new SomeWorker(
ctx.ResolveNamed<ICentralLogger>("GlobalLog"),
ctx.ResolveNamed<ICentralLogger>("WorkerLog"),
ctx.Resolve<IStorageProvider>(),
ctx.Resolve<IConfigProvider>())
)
.As<IWorker>()
.Named<IWorker>("SomeWorker");
builder.Register(
ctx=>newsomeworker(
ctx.ResolveNamed(“Globall”),
ctx.ResolveName(“WorkerLog”),
ctx.Resolve(),
ctx.Resolve())
)
.As()
.姓名(“某工人”);
到目前为止效果不错
现在我必须用3个泛型类型注释扩展IWorker接口和实现(比如SomeWorker)
interface IWorker<T1,T2,T2>
{}
class SomeWorker<T1,T2,T2> : IWorker<T1,T2,T2>
{}
界面IWorker
{}
类SomeWorker:IWorker
{}
我正在努力找到适合命名构造函数注入参数的正确注册语法
为了进行测试,我尝试了注册,但没有选择构造函数,但是工人没有在容器中注册…:
builder.RegisterGeneric(typeof(SomeWorker<,,>)
.As(typeof(IWorker<,,>))
.Named("SomeWorker", typeof(IWorker<,,>));
builder.RegisterGeneric(typeof(SomeWorker)
.As(类型(IWorker))
.命名为(“某个工人”,类型为(IWorker));
最后,我需要帮助找到这样的通用注册(不工作的伪代码):
builder.RegisterGeneric(typeof(SomeWorker),
ctx=>newsomeworker(
ctx.ResolveNamed(“Globall”),
ctx.ResolveName(“WorkerLog”),
ctx.Resolve(),
ctx.Resolve())
)
.As(类型(IWorker))
.命名为(“某个工人”,类型为(IWorker));
编辑:
示例接口和示例IWorker实现:
我有大约5个IWorker实现、8个BaseJob子体、8个结果类型(IJobResult实现)和3个StorageProviders
public interface IWorker<TJ, TJR, TS> : IDisposable
where TJR : IJobResult<TJ, TS>
where TJ : BaseJob
where TS : IStorageProvider
{
IWorker<TJ, TJR, TS> CreateJob( .... );
IWorker<TJ, TJR, TS> Validate( .... );
TJR RunJob();
Task<TJR> RunJobAsync();
}
public class SomeWorker<TJ, TJR, TS> : IWorker<TJ, TJR, TS>, IDisposable
where TJR : IJobResult<TJ, TS>
where TJ : SomeJob
where TS : IStorageProvider
{
public SomeWorker(ICentralLogger globalLog, ICentralLogger workerLog, LocalFileSystemStorageProvider storageProvider, IConfigProvider configProvider)
{
m_GlobalLog = globalLog;
m_WorkerLog = workerLog;
...
InitializeWorker(configProvider.GetWorkerConfig((typeof(this).GetName.Name));
}
#region IWorker
// ...
#endregion
#region IDisposable
public Dispose()
{}
#endregion
}
公共接口IWorker:IDisposable
其中TJR:IJobResult
哪里TJ:BaseJob
其中TS:IStorageProvider
{
IWorker创建作业(..);
i工作人员验证(…);
TJR RunJob();
任务RunJobAsync();
}
公共类SomeWorker:IWorker,IDisposable
其中TJR:IJobResult
TJ:什么工作
其中TS:IStorageProvider
{
公共SomeWorker(ICentraloger Globallo、ICentraloger workerLog、LocalFileSystemStorage Provider storageProvider、IConfigProvider configProvider)
{
m_globallo=globallo;
m_WorkerLog=WorkerLog;
...
初始化Worker(configProvider.GetWorkerConfig((typeof(this.GetName.Name));
}
#区域IWorker
// ...
#端区
#可识别区域
公共处置
{}
#端区
}
您的问题标题应该-您应该重新措辞,删除明确的“C#”和“Autofac”标题中的分隔/标记。像这样的开放泛型有点难,因为您不仅需要提供类型参数,还需要提供构造函数参数。您能为开放泛型类型
SomeWorker
提供构造函数吗?我更改了标题,添加了IWorker接口和示例实现。您的问题是标题应-您应重新措辞以删除显式的“C#”和“Autofac”标题中的分隔/标记。像这样的开放泛型有点难,因为您不仅需要提供类型参数,还需要提供构造函数参数。您能为开放泛型类型SomeWorker
提供构造函数吗?我更改了标题,添加了IWorker接口和示例实现。
public interface IWorker<TJ, TJR, TS> : IDisposable
where TJR : IJobResult<TJ, TS>
where TJ : BaseJob
where TS : IStorageProvider
{
IWorker<TJ, TJR, TS> CreateJob( .... );
IWorker<TJ, TJR, TS> Validate( .... );
TJR RunJob();
Task<TJR> RunJobAsync();
}
public class SomeWorker<TJ, TJR, TS> : IWorker<TJ, TJR, TS>, IDisposable
where TJR : IJobResult<TJ, TS>
where TJ : SomeJob
where TS : IStorageProvider
{
public SomeWorker(ICentralLogger globalLog, ICentralLogger workerLog, LocalFileSystemStorageProvider storageProvider, IConfigProvider configProvider)
{
m_GlobalLog = globalLog;
m_WorkerLog = workerLog;
...
InitializeWorker(configProvider.GetWorkerConfig((typeof(this).GetName.Name));
}
#region IWorker
// ...
#endregion
#region IDisposable
public Dispose()
{}
#endregion
}