2017-07-19 27 views
0

目前,我正在研究一個大型項目,其中有一個經常更新以包含需要通過Unity註冊的新類的DLL(我們稱之爲Common.DLL)爲DI。還有大約3個其他應用程序(網站,WCF服務等)都參考了這個DLL,並且有它們自己的Unity配置文件,如果在Common中創建了一個新類,所有需要更新的都會註冊這個新類型。管理引用公共庫的.NET應用程序的Unity註冊

顯然,這可能是一個痛苦的管理,我繼承了這個項目,所以我想辦法讓這個過程更容易。應該指出的是,Common.DLL當然可以放置在Nuget包中並以這種方式分發。

我或多或少地看到,如果有人知道我更新Common.DLL或Common NuGet包的新方法,而其他應用程序更新他們的註冊時Common.DLL他們引用更改或當包已更新。對於任何反饋,我們都表示感謝。謝謝!

+0

是否每個項目需要以不同的方式來註冊Common.dll類型或者是註冊不同的項目之間是否一致? –

+0

一致,例如你向Common添加一個新類,並且你需要爲該類添加一個註冊。這很容易做到,只是需要爲每個引用它的應用程序多次完成。 – forevermetal02

回答

1

由於您提到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();