Autofac open generics:基于<u>的工厂IIndex

时间:2017-02-17 09:15:56

标签: c# generics autofac

这里是Autofac的新手。

我想最终使用一个基于枚举密钥来获取实例的工厂。

示例:

public enum TransactionType
{
    one,
    two,
    three
}

public interface IResponse
{
    TransactionType type { get; set; }
}

public class ResponseOne : IResponse
{
    public TransactionType type { get; set; } = TransactionType.one;
}

public class ResponseTwo : IResponse
{
    public TransactionType type { get; set; } = TransactionType.two;
}

public class ResponseThree : IResponse
{
    public TransactionType type { get; set; } = TransactionType.three;
}

public interface IRequest { }

public interface IClient<U>
    where U : IResponse
{
    void DoWork<T>(T Request)
        where T : class, IRequest, new();
}

public class Client<U> : IClient<U>
    where U : class, IResponse, new()
{
    U Response;

    public void DoWork<T>(T Request)
        where T : class, IRequest, new()
    {
        Response = default(U);
    }
}

我想让Autofac做的是为工厂提供必要的IIndex,以便我可以根据&lt; U&gt;选择正确的客户端。工厂如下:

public class ClientFactory
{
    readonly IIndex<TransactionType, IClient<IResponse>> Clients;

    public ClientFactory(IIndex<TransactionType, IClient<IResponse>> Clients)
    {
        this.Clients = Clients;
    }

    public IClient<IResponse> PickClient(TransactionType type) => Clients[type];
}

我和建造者一起走了这么远:

var builder = new ContainerBuilder();

builder.RegisterType<Client<ResponseOne>>()
    .AsImplementedInterfaces()
    .Keyed<IClient<IResponse>>(TransactionType.one);

builder.RegisterType<Client<ResponseTwo>>()
    .AsImplementedInterfaces()
    .Keyed<IClient<IResponse>>(TransactionType.two);

builder.RegisterType<Client<ResponseThree>>()
    .AsImplementedInterfaces()
    .Keyed<IClient<IResponse>>(TransactionType.three);

1)我不知道如何以更优雅的方式做到这一点,如果有的话。即:亲爱的Autofac,请为程序集中的每个IResponse生成一个包含IClient的IIndex,并按其类型键入。

2)使用Container.Resolve似乎比直接使用工厂(Autofac open generics文档章节所说的那样)更直接。这不是服务地点(=反模式)吗?

谢谢。

0 个答案:

没有答案