这里是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文档章节所说的那样)更直接。这不是服务地点(=反模式)吗?
谢谢。