使用构造函数选择和命名类型在Autofac中注册通用类型

时间:2016-02-09 16:13:15

标签: c# generics inversion-of-control autofac registration

我的"工人 - 班级"需要使用预定义的构造函数进行注册,因为构造函数注入需要解析命名参数。

过去我以这种方式注册了这个工人类型:

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      
}

0 个答案:

没有答案
相关问题