2017-02-27 4 views
0

私はunity.configで統一の設定を定義したMVCアプリケーションユニティコンテナをコントローラからユニティコンフィグレーションで定義する方法は?

におけるマイクロソフトの団結を設定しようとしています:

public static class UnityConfig 
{ 
    public static void RegisterComponents() 
    { 
     var container = new UnityContainer(); 
     container.RegisterType<IAccessLogBLL, AccessLogBLL>();    
     DependencyResolver.SetResolver(new UnityDependencyResolver(container)); 
    } 
} 

私はGlobal.asaxのからその設定を呼び出す:

protected void Application_Start() 
    { 
     GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore; 

     UnityConfig.RegisterComponents(); 


    } 

私はそのメソッドを解決するために呼び出す前にコントローラからそのコンテナの設定を定義して正常に動作しますが、unity.configで定義されたコンテナはどのように使用できますか? "getContainer"メソッドがありますか、またはユニティコンテナのグローバル変数を宣言する必要がありますか?

private IAccessLogBLL _accessLogBLL; 
    public AccessLogController() 
    { 

     IUnityContainer container = new UnityContainer();    
     container.RegisterType<IAccessLogBLL, AccessLogBLL>(); 
     DependencyResolver.SetResolver(new UnityDependencyResolver(container)); 
     _accessLogBLL = container.Resolve<IAccessLogBLL>(new ParameterOverride("unitOfWork", UnitOfWork)); 
    } 

おかげで、私の英語

答えて

1

について申し訳ありませんがFinallly私は、コンテナの変数、静的に宣言し、それが正常に動作します。しかし、今はそれが最善の解決策ではありません。

public static class UnityConfig 
{ 
    public static IUnityContainer container; 
    public static void RegisterComponents() 
    { 
     container = new UnityContainer(); 
     container.RegisterType<IAccessLogBLL, AccessLogBLL>();    
     DependencyResolver.SetResolver(new UnityDependencyResolver(container)); 
    } 
} 

そして、私のコントローラのコンストラクタを形成:

public AccessLogController() 
    { 

     _accessLogBLL = UnityConfig.container.Resolve<IAccessLogBLL>(new ParameterOverride("unitOfWork", UnitOfWork)); 

    } 
+1

そのアプローチは結構ですが、私は([レイジー](https://msdn.microsoft.com/en-us/library/dd642331を使用しますv = 1.10).aspx)を使用してスレッドの安全を確保します。たとえば、次のように 'プライベート静的レイジーコンテナ=新しいレイジー(()=> { するvarコンテナ=新しいUnityContainer(); /*ここにあなたのタイプを登録*/ リターン容器と、 }) ; – strangecat

+0

適切な[スレッドセーフティモード]を選択できます(https://msdn.microsoft.com/en-us/library/system.threading.lazythreadsafetymode(v = vs.110).aspx) – strangecat

+0

ありがとう、私はあなたのアドバイスをチェックします – Mikelon85

関連する問題