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      
}