2010-06-10 74 views
6

在新的WPF项目(VS2010)中,我第一次使用Unity 2。 在这个项目中,我使用以下结构:如何在多项目解决方案中使用Unity进行解析

解决方案

WPF项目

类分享帮助

类Library2

类库3 ....

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

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

现在让我们假设我想要在类库1中解决构造器注入的构造器注入问题。 显然容器在其他项目中是不知道的!

我该怎么做?

回答

9

我大多数人都同意克里斯的回答,但我认为配置文件是icky(特别是对于Unity),所以这里有一个解决方案,允许您使用运行时配置W/O循环引用。我们将要与注册管理机构合作。

创建将包含IConfigureUnity的基础结构项目。

public interface IConfigureUnity 
{ 
    public void Configure(UnityContainer container); 
} 

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

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

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

var container = new UnityContainer(); 
new RegistryForSomeClassLibrary().Configure(container); 
new RegistryForAnotherClassLibrary().Configure(container); 

现在你有一个完全配置的容器实例w/o任何配置文件。

+0

假设我在Class Library 1中有一个名为“ManageUser”的对话框。 ManageUser如何获取WPF项目中声明的容器实例? – 2013-08-09 17:01:25

+1

@Ryan - 是否有任何理由在一个通用项目中使用接口?为什么不使Registry类和Configure方法都是静态的,并调用它:'RegistryForSomeClassLibrary.Configure(container); RegistryForAnotherClassLibrary.Configure(容器);'我测试了这个,它工作。我错过了什么吗? – Shevek 2014-05-25 02:19:07

+0

@Shevek,这工作正常。我曾经使用反思来解决我的注册问题,但是一段时间后放弃了。现在我明确地在每个注册表中调用'Configure()'。 – Ryan 2014-05-25 02:52:48

0

要让多个项目在此方案中使用相同的UnityContainer,您需要一个包含UnityContainer的“公共”项目,并将其公开,以便所有其他项目都可以访问它。

WPF项目

类库1

类库2

类库3

公用库(UnityContainer住在这里)

为了避免循环项目依赖关系,我建议使用Unity design-time configuration via a configuration file而不是运行时配置(如在您的示例中所示)。否则,您的公共库将不得不引用包含所有解析类型的项目,而这些项目又将依赖于公共库(因为大概您将公开UnityContainer实例的位置)。您可能能够使用运行时配置来工作,但我没有尝试过;我知道设计时配置的工作原理与我完成的几个项目完全一样。

+0

谢谢克里斯,会试试看! – 2010-06-25 06:57:55

相关问题