2009-02-17 50 views
1

我是使用Unity和IoC/DI概念的新手。我通过在考试中通过James Kovacs在dnrTV上的秀展开自己的创意。收到我使IUnityContainer对象使用Singleton模式?

他的示例将Container作为单例通过IoC类中的静态方法访问,以便您可以在启动时注册类型并在整个应用程序中解析类型。

我知道这不是全功能,主要是显示IoC的概念。

我现在正试图在项目中使用Unity。

在我的主要()我创建一个新的容器,但是一旦我的WinForms打开,容器超出范围并处置。在程序后面,当我尝试解析类型时,我不再拥有原始容器及其注册类型。

是否有我缺少的概念或实现构造?

我现在的想法是创建这样的:

public static class Container 
{ 
    private static readonly object syncRoot = new object(); 
    private static volatile IUnityContainer instance; 

    public static IUnityContainer Instance 
    { 
     get 
     { 
      if (instance == null) 
      { 
       lock (syncRoot) 
       { 
        if (instance == null) 
        { 
         instance = new UnityContainer(); 
        } 
       } 
      } 
      return instance; 
     } 
    } 
} 

我敢肯定,这将工作,它只是看起来不正确。

谢谢
基思

回答

1

我使用一个静态类只是同样的原因 - 避免它走出去的范围。

一个区别我做你的是,我所有包装的统一调用,并添加检查是否统一已配置,因为你会在这里看到:

using System.Configuration; 
using Microsoft.Practices.Unity; 
using Microsoft.Practices.Unity.Configuration; 

namespace Utilities 
{ 
    public static class ServiceLocator 
    { 
     private static IUnityContainer container = new UnityContainer(); 
     private static bool isConfigured; 

     public static void Clear() 
     { 
      container = new UnityContainer(); 
     } 

     private static IUnityContainer Container 
     { 
      get 
      { 
       if (!isConfigured) 
       { 
        ConfigureContainer(); 
       } 
       return container; 
      } 
     } 

     public static T Resolve<T>() 
     { 
      return Container.Resolve<T>(); 
     } 

     public static T Resolve<T>(string name) 
     { 
      return Container.Resolve<T>(name); 
     } 

     public static void AddInstance<T>(object instance) 
     { 
      Container.RegisterInstance(typeof (T), instance); 
     } 

     private static void ConfigureContainer() 
     { 
       UnityConfigurationSection section = (UnityConfigurationSection) ConfigurationManager.GetSection("unity"); 
       section.Containers.Default.Configure(container); 
       isConfigured = true;   
     } 
    } 
} 
+0

谢谢你,我不是配置我的容器在静态类中。我认为这使我可以灵活地在测试情况下更改配置,而不用在测试中使用“生产”配置时自动注入配置。 – 2009-02-25 15:31:19