如何在mutli-project解决方案中使用Unity进行解析

Sav*_*dis 7 inversion-of-control unity-container

在一个新的WPF项目(VS2010)中,我第一次使用Unity 2.在这个项目中,我使用以下结构:

WPF项目

类库1

班级图书馆2

班级图书馆3 ....

使用Unity注册不同类型是在WPF Project中使用以下代码段完成的:

IUnityContainer container = new UnityContainer()
                            .RegisterType<IObjectContext, ObjectContextAdapter>()
                            .RegisterType<IConnectionStringProvider, ConnectionStringProvider>()
                            .RegisterType(typeof(IRepository<>), typeof(Repository<>));
Run Code Online (Sandbox Code Playgroud)

现在让我说我想<Orders在类库1中解析Repository > constructor-inject.显然,容器在其他项目中并不为人所知!

我该怎么做?

Rya*_*yan 10

我大多同意Chris的回答,但我认为配置文件很笨(特别是对于Unity)所以这里有一个解决方案,允许你使用没有循环引用的运行时配置.我们将通过注册表执行此操作.

创建一个包含IConfigureUnity的基础结构项目.

public interface IConfigureUnity
{
    public void Configure(UnityContainer container);
}
Run Code Online (Sandbox Code Playgroud)

每个类库项目都将负责实现此接口以注册它自己的类.

public class RegistryForSomeClassLibrary : IConfigureUnity
{
    public void Configure(UnityContainer container)
    {
        container
            .RegisterType<IObjectContext, ObjectContextAdapter>()
            .RegisterType<IConnectionStringProvider, ConnectionStringProvider>()
            .RegisterType(typeof(IRepository<>), typeof(Repository<>));
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在您的WPF项目中,您需要创建容器并应用这些注册表.

var container = new UnityContainer();
new RegistryForSomeClassLibrary().Configure(container);
new RegistryForAnotherClassLibrary().Configure(container);
Run Code Online (Sandbox Code Playgroud)

现在你有一个完全配置的容器实例,没有任何配置文件.