我的"工人 - 班级"需要使用预定义的构造函数进行注册,因为构造函数注入需要解析命名参数。
过去我以这种方式注册了这个工人类型:
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");
到目前为止,这个工作正常。
现在我必须使用3种泛型类型注释扩展IWorker接口和实现(如SomeWorker)
interface IWorker<T1,T2,T2>
{}
class SomeWorker<T1,T2,T2> : IWorker<T1,T2,T2>
{}
我正在努力寻找适合注册构造函数注入参数的正确注册语法。
为了测试我尝试了没有构造函数选择的注册,但工作人员没有在容器中注册......:
builder.RegisterGeneric(typeof(SomeWorker<,,>)
.As(typeof(IWorker<,,>))
.Named("SomeWorker", typeof(IWorker<,,>));
最后,我需要帮助才能找到像这样的通用注册(不工作的伪代码):
builder.RegisterGeneric(typeof(SomeWorker<,,>),
ctx => new SomeWorker(
ctx.ResolveNamed<ICentralLogger>("GlobalLog"),
ctx.ResolveNamed<ICentralLogger>("WorkerLog"),
ctx.Resolve<IStorageProvider>(),
ctx.Resolve<IConfigProvider>())
)
.As(typeof(IWorker<,,>))
.Named("SomeWorker", typeof(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
}