2016-05-31 4 views
8

私はいくつかのリソースDI'dを持つWeb APIコントローラーを持っています。後で私はMVCコントローラを追加しましたが、今では同じリソースDIが必要になります。単純なインジェクターは、MVCとWeb APIコントローラーの両方で初期化されます

[assembly: WebActivator.PostApplicationStartMethod(typeof(CineplexSearch.App_Start.SimpleInjectorWebApiInitializer), "Initialize")] 

namespace CineplexSearch.App_Start 
{ 
    using System.Web.Http; 
    using SimpleInjector; 
    using SimpleInjector.Integration.WebApi; 

    public static class SimpleInjectorWebApiInitializer 
    { 
     /// <summary>Initialize the container and register it as Web API Dependency Resolver.</summary> 
     public static void Initialize() 
     { 
      var container = new Container(); 
      container.Options.DefaultScopedLifestyle = new WebApiRequestLifestyle(); 

      InitializeContainer(container); 

      container.RegisterWebApiControllers(GlobalConfiguration.Configuration); 

      container.Verify(); 

      GlobalConfiguration.Configuration.DependencyResolver = 
       new SimpleInjectorWebApiDependencyResolver(container); 
     } 

     private static void InitializeContainer(Container container) 
     { 
      container.Register<ICachingManager, CachingManager>(Lifestyle.Transient); 
      container.Register<IDataAccessLayer, DataAccessLayer>(Lifestyle.Transient); 
     } 
    } 
} 

MVCコントローラのDIも同じ場所に登録できますか?コンテナを再利用できますか?

更新:私は閉じる必要がありますが、Web APIコントローラでパラメータのないコンストラクタが必要なエラーが発生しました。私はそれを追加しようとしたが、その後何ももちろん注入しないます

public static class SimpleInjectorWebApiInitializer 
{ 
    /// <summary>Initialize the container and register it as Web API Dependency Resolver.</summary> 
    public static void Initialize() 
    { 
     var container = new Container(); 
     container.Options.DefaultScopedLifestyle = new WebRequestLifestyle(); 

     InitializeContainer(container); 

     container.RegisterWebApiControllers(GlobalConfiguration.Configuration); 
     container.RegisterMvcControllers(Assembly.GetExecutingAssembly()); 

     container.Verify(); 

     //GlobalConfiguration.Configuration.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(container); 
     DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container)); 
    } 

    private static void InitializeContainer(Container container) 
    { 
     container.Register<ICachingManager, CachingManager>(Lifestyle.Transient); 
     container.Register<IDataAccessLayer, DataAccessLayer>(Lifestyle.Transient); 
    } 
} 

答えて

10

を私は容器を再利用することはできますか?

はい、できます。すべてのアプリドメインには通常、1つのコンテナインスタンスが必要です。

シンプルインジェクタのドキュメントのMVC integration documentationは次のようにMVC DependencyResolverを設定する必要があることを説明しています

DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container)); 

物事を簡単にするためにしかし、あなたはDefaultScopedLifestyleとしてWebRequestLifestyleを登録する必要があります。

container.Options.DefaultScopedLifestyle = new WebRequestLifestyle(); 

これは、IIS内でWeb APIを単独で実行しているため、Web APIでも同様に動作します。

したがって、両方のDependencyResolversを設定する必要があります。

+0

おかげで、ほとんどそれは、あなたが私の更新を参照してくださいすることができ、私が働いていますか? – FailedUnitTest

+0

@FailedUnitTest両方の依存関係リゾルバが必要です。したがって、Web API依存リゾルバも同様です。 – Steven

+0

それはそれを固定しました、スティーブンありがとう! – FailedUnitTest

0

私は2つのセントを追加したいと思っています。スティーブンの答えとその下のコメントを読んだあと、私はまだいくつかの誤りがあります。結局のところ、これは、物事が構成される順序と関係していました。

protected void Application_Start() 
{ 
    //set the default scoped lifestyle 
    Container container = new Container(); 
    container.Options.DefaultScopedLifestyle = new WebRequestLifestyle(); 

    ... 
    //do class registration here. I did it with Scoped lifestyle 
    ... 
    //Let the SimpleInjector.Intergration packages register the controllers.  
    container.RegisterWebApiControllers(GlobalConfiguration.Configuration); 
    container.RegisterMvcControllers(Assembly.GetExecutingAssembly()); 

    AreaRegistration.RegisterAllAreas(); 
    //This must be here because we first need to do above before registering the web api. See WebApiConfig code. 
    GlobalConfiguration.Configure(WebApiConfig.Register); 
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
    RouteConfig.RegisterRoutes(RouteTable.Routes); 
    BundleConfig.RegisterBundles(BundleTable.Bundles); 

    //don't set the resolver here, do it in WebApiConfig.Register() 
    //DependencyResolver.SetResolver(new SimpleInjectorWebApiDependencyResolver(container)); 
    DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container)); 
    container.Verify(SimpleInjector.VerificationOption.VerifyAndDiagnose); 
} 

WebApiConfig:迅速な返信用

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     // Web API routes 
     config.MapHttpAttributeRoutes(); 
     //set the webApi resolver here! 
     config.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(DependencyInjectionCoreSetup._Container); 
     //then the rest.. 
     var route = config.Routes.MapHttpRoute(
     .... 
    } 
} 
関連する問題