2012-05-12 133 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服務的註冊,你應該