由於您提到Common中的類對於每個應用程序都以相同的方式註冊,因此我會爲Common中的所有類創建程序註冊。 Unity允許混合編程和聲明性配置。因此Common.dll組件可以以編程方式註冊,而應用程序特定註冊(可能會更改)可以使用XML配置完成。
我會在Common.dll的開發者身上創建註冊的負擔,因爲他們知道應該如何註冊類,而且只需要執行一次(而不是每個應用程序)。當有更新時,所有的應用程序都會在不更改任何代碼的情況下提取註冊更改。
您可能不希望Common.dll直接依賴Unity,因此您可能需要創建一個單獨的程序集來註冊,例如Common.Ioc.Unity.dll
,並在那裏提供一種引導Common.dll註冊的方法。例如
public class RegistrationManager : IRegistrationManager
{
private IUnityContainer container;
public RegistrationManager(IUnityContainer container)
{
this.container = container;
}
public void RegisterCommon()
{
this.container.RegisterType<Common.Logger>(new ContainerControlledLifetimeManager());
}
}
你甚至可以提供不同的註冊風格來支持不同的容器(如果需要的話)。
缺點是,這是一個小程序集,也必須由應用程序引用。如果有許多類似於Common.dll的程序集,那麼考慮將所有共享註冊都放入一個程序集中可能是有意義的。
上述的另一個(樣式)變體是使用容器擴展實現註冊。例如:
public class CommonContainerExtension : UnityContainerExtension
{
protected override void Initialize()
{
Container.RegisterType<Common.Logger>(new ContainerControlledLifetimeManager());
}
}
然後在應用程序,你可以使用註冊:
var container = new UnityContainer();
// Register Common.dll using container extension or RegistrationManager
container.AddNewExtension<CommonContainerExtension>();
// Register XML configuration for application
// Application can even overwrite Common.dll registrations from above if required
container.LoadConfiguration();
是否每個項目需要以不同的方式來註冊Common.dll類型或者是註冊不同的項目之間是否一致? –
一致,例如你向Common添加一個新類,並且你需要爲該類添加一個註冊。這很容易做到,只是需要爲每個引用它的應用程序多次完成。 – forevermetal02