目前,我正在开发一个大型项目,其中有一个DLL(我们称之为Common.DLL),它经常更新以包含需要通过Unity for DI注册的新类。大约有3个其他应用程序(网站,WCF服务等)都引用了这个DLL并拥有自己的Unity配置文件,如果在Common中创建了一个新类,则需要更新以注册这个新类型。
显然,这可能是一个痛苦的管理,我继承这个项目所以我正在考虑如何使这个过程更容易。应该注意的是,Common.DLL当然可以放入Nuget包中并以这种方式分发。
我或多或少看到是否有人知道我用一个新类更新Common.DLL或Common NuGet包的好方法,而其他应用程序在他们引用的Common.DLL发生更改或包时更新其注册已更新。对于任何反馈,我们都表示感谢。谢谢!
答案 0 :(得分:1)
由于您提到Common中的类以相同的方式为每个应用程序注册,因此我将为Common中的所有类创建编程注册。 Unity允许将程序化与声明式配置混合。因此,可以通过编程方式注册Common.dll组件,而特定于应用程序的注册(可能会更改)可以使用XML配置完成。
我会将创建注册的负担放在Common.dll的开发人员身上,因为他们知道应该如何注册类,并且只需要执行一次(而不是每个应用程序)。当有更新时,所有应用程序都会在不更改任何代码的情况下获取注册更改。
您可能不希望Common.dll直接依赖Unity,因此您可能希望为Common.Ioc.Unity.dll
等注册创建单独的程序集,并在其中提供引导Common.dll注册的方法。 e.g。
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();