由于您提到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