2017-07-19 24 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();