2012-05-12 97 views
1

是否可以使用autofac按名称对组件的注册进行分组?
例如,下面的代码有两个注册IDbContextProvider。
我希望WfcService只解析IDbContextProvider的一个命名实例(“无代理”)。 我想使用类似DependsOnNamed(“无代理”)方法显式设置具有相同名称的一组命名实例的依赖关系。

我希望整个系统使用IDbContextProvider的默认实现,而IWfcService的后继应使用它们自己的命名实例。autofac中的指定注册

var builder = new ContainerBuilder(); 
builder.RegisterType<DbContextProvider>().As<IDbContextProvider>().As<IDbContextProvider>(); 
builder.RegisterType<ProxyLessDbContextProvider>().Named<IDbContextProvider>("proxyless"); 

builder.RegisterType<Repository>().As<IRepository>();//depends on IDbContextProvider 
builder.RegisterType<BusinessService>().As<IBusinessService>();//depends on IRepository 

builder.RegisterType<WfcService>().As<IWfcService>().DependsOnNamed("proxyless");//depends on IBusinessService 

IContainer container = builder.Build(); 

var wcf = container.Resolve<IWfcService>(); // should depend on "proxyless" IDbContextProvider 
+0

不要以为你可以做到这一点,但也许你可以使用终生范围的“标签”功能和InstancePerMatchingLifetimeScope(标签)的方法来做到这一点。 –

+0

它现在似乎有效。我使用的技巧是'AutofacHostFactory.Container = _container.BeginLifetimeScope(PersistanceRegistrationModule.ProxylessScope);'因此,每个wcf服务调用都使用自己的标记生命周期范例来实例化一个适当的IDbContextProvider实例。感谢您的建议。 – Stas

+0

不幸的是,InstancePerMatchingLifetimeScope“覆盖”默认实现,并且从“根”范围解析不起作用 – Stas

回答

1

实现所描述的行为的最合适的方法是使用具有重写注册的独立作用域。如果你要覆盖WCF服务的注册,你应该