我试图通过Autofac了解委托工厂模式。我知道如何使用IIndex<>实现工厂使用Keyed()注册,这里有很好的解释:Configuring an Autofac delegate factory that's defined on an abstract class
我想知道我是否可以使用Func<>创建工厂,以及如何为以下示例进行注册:
public enum Service
{
Foo,
Bar
}
public interface FooService : IService
{
ServiceMethod();
}
public interface BarService : IService
{
ServiceMethod();
}
public class FooBarClient
{
private readonly IService service;
public FooBarClient(Func<Service, IService> service)
{
this.service = service(Service.Foo);
}
public void Process()
{
service.ServiceMethod(); // call the foo service.
}
}
答案 0 :(得分:20)
Autofac无法为您构建此Func<Service, IService>
,您可以根据参数返回不同的类型。这是IIndex<>
的用途。
但是,如果您不想/不能使用IIndex<>
,您可以在Keyed
或Named
的帮助下创建此工厂功能,并在容器中注册您的工厂:
var builder = new ContainerBuilder();
builder.RegisterType<FooBarClient>().AsSelf();
builder.RegisterType<FooService>().Keyed<IService>(Service.Foo);
builder.RegisterType<BarService>().Keyed<IService>(Service.Bar);
builder.Register<Func<Service, IService>>(c =>
{
var context = c.Resolve<IComponentContext>();
return s => context.ResolveKeyed<IService>(s);
});