C# Autofac和通用类型工厂,如Castle Windsor

C# Autofac和通用类型工厂,如Castle Windsor,c#,autofac,typed-factory-facility,C#,Autofac,Typed Factory Facility,在当前项目中,我使用的是Autofac,但我通常使用Castle Windsor,因此我试图了解如何使用Autofac解析Castle Windsor中可用的类型化工厂模式 我有以下查询和查询处理程序合同: public interface IQuery<out TResult> { } public interface IQueryHandler<in TQuery, out TResult> where TQuery : IQuery<TResult>

在当前项目中,我使用的是Autofac,但我通常使用Castle Windsor,因此我试图了解如何使用Autofac解析Castle Windsor中可用的类型化工厂模式

我有以下查询和查询处理程序合同:

public interface IQuery<out TResult>
{

}

public interface IQueryHandler<in TQuery, out TResult> where TQuery : IQuery<TResult>
{
    TResult Handle(TQuery query);
}
公共接口iquiry
{
}
公共接口IQueryHandler,其中TQuery:IQuery
{
TResult句柄(TQuery查询);
}
每个契约都有多个实现,因此对于每个
IQuery
都有一个相应的
IQueryHandler
实现

我使用这种流畅的方法注册所有人:

public class CqrsModule : Module
{
    /// <inheritdoc />
    protected override void Load(ContainerBuilder builder)
    {
        // prepare all assemblies for IoC
        var assemblies = new[]
        {
            typeof(IQuery<>).Assembly,
            typeof(IQueryHandler<,>).Assembly,
            typeof(IBus).Assembly
        };

        // autofac regisration
        builder.RegisterAssemblyTypes(assemblies)
            .AsClosedTypesOf(typeof(IQuery<>))
            .AsClosedTypesOf(typeof(IQueryHandler<,>))
            .AsClosedTypesOf(typeof(IBus));
    }
}
公共类CqrsModule:模块
{
/// 
受保护的覆盖无效负载(ContainerBuilder builder)
{
//为国际奥委会准备所有集会
var assemblies=new[]
{
类型(IQuery)。组件,
类型(IQueryHandler).程序集,
类型(IBus).组件
};
//自动定位
builder.RegisterAssemblyTypes(程序集)
.AsClosedTypesOf(typeof(IQuery))
.AsClosedTypesOf(typeof(IQueryHandler))
.AsClosedTypesOf(类型(IBus));
}
}
但我有个问题。从我的总线上,我不想知道现有的处理程序,因此我使用类型化工厂,如下所示:

public interface IQueryFactory
{
    IQueryHandler<TQuery, TResult> BuildHandler<TQuery, TResult>() 
    where TQuery : IQuery<TResult>;
}
公共接口工厂
{
IQueryHandler BuildHandler()
其中TQuery:IQuery;
}
但我不知道如何使用Autofac注册这个类型化工厂。在温莎城堡,我只想:

kernel.Register(
    Component.For<IQueryFactory>()
        .AsFactory()
);
kernel.Register(
用于()的组件
.AsFactory()
);

显然答案是否定的,因为Autofac没有类型化工厂的概念

另一种方法是保留合同,仅为特定案例场景创建合同的实现,该场景在Autofac中使用类型化工厂

公共密封类汽车工厂:IQueryFactory
{
私有只读ILifetimeScope作用域;
公共汽车工厂(ILifetimeScope范围)
{
this.scope=范围;
}
/// 
public IQueryHandler BuildHandler(),其中TQuery:IQuery
{
返回此.scope.Resolve();
}
}
注意 根据Autofac文档,您应该注入
ILifetimeScope
,而不是
IContainer

public sealed class AutofacQueryFactory : IQueryFactory
{
    private readonly ILifetimeScope scope;

    public AutofacQueryFactory(ILifetimeScope scope)
    {
        this.scope = scope;
    }

    /// <see cref="IQueryFactory" />
    public IQueryHandler<TQuery, TResult> BuildHandler<TQuery, TResult>() where TQuery : IQuery<TResult>
    {
        return this.scope.Resolve<IQueryHandler<TQuery, TResult>>();
    }
}