2012-06-28 21 views
17

私はSimple Injector IOCコンテナを初めて使用しています。 MVC 4 ASP.NET Web APIを使用してマルチテナントASP.NET MVCを実装するプロジェクトを開始します。Simple InjectorはMVC 4 ASP.NET Web APIをサポートしていますか?

私の質問は:簡単なインジェクタはMVC 4 ASP.NET Web APIをサポートしていますか? thisのような簡単なインジェクタのドキュメントを読むと、MVC 3への参照となり、MVC 4もサポートされているかどうかを知りたいと思います。

+0

Simple Injector 2.5には[Web API統合パッケージ](https://simpleinjector.codeplex.com/wikipage?title=Web%20API%20Integration)が含まれています。 – Steven

答えて

24

シンプルなインジェクタIOCは、MVC 4 ASP.NET Web APIをサポートしていますか?

現在、MVC4 Web APIはサポートされていませんが、今後サポートが追加される予定です。この場合、The integration guideが更新されます。


UPDATEWeb API supportはシンプルインジェクタ2.5に追加されました。一方


、あなたはシンプルインジェクタのための独自のSystem.Web.Http.Dependencies.IDependencyResolverの実装を作成することができます。以下は、環境を主催IISでWeb APIを使用するための実装です:

public class SimpleInjectorHttpDependencyResolver : 
    System.Web.Http.Dependencies.IDependencyResolver 
{ 
    private readonly Container container; 

    public SimpleInjectorHttpDependencyResolver(
     Container container) 
    { 
     this.container = container; 
    } 

    public System.Web.Http.Dependencies.IDependencyScope 
     BeginScope() 
    { 
     return this; 
    } 

    public object GetService(Type serviceType) 
    { 
     IServiceProvider provider = this.container; 
     return provider.GetService(serviceType); 
    } 

    public IEnumerable<object> GetServices(Type serviceType) 
    { 
     IServiceProvider provider = this.container; 
     Type collectionType = typeof(IEnumerable<>).MakeGenericType(serviceType); 
     var services =(IEnumerable<object>)this.ServiceProvider.GetService(collectionType); 
     return services ?? Enumerable.Empty<object>(); 
    } 

    public void Dispose() 
    { 
    } 
} 

あなたは、要求が終了し得る場所(ウェブホスティング環境内のスコープを実装するためのPer Web Api Request寿命を使用する必要があるため、この実装は、何のスコープを実装していませんそれが開始された場所とは異なるスレッド上にあります)。

Because of the way Web API is designedすべてのWeb APIコントローラを明示的に登録することが非常に重要です。次のコードを使用してこの操作を行うことができます。

// NOTE: Do this as last step, after registering the controllers. 
GlobalConfiguration.Configuration.DependencyResolver = 
    new SimpleInjectorHttpDependencyResolver(container); 
+0

ありがとうございます。 – user1489941

+0

私が持っているもう1つの質問は:簡単な注射器を使って反射を避けることができますか? – user1489941

+0

キューのコード修正: 'GetAllInstance'を 'GetAllInstances'に修正しました。 Unforunatelyでは、SOは6つ以上の文字を編集する必要がありますが、コード*の場合、コンピュータは容赦しません。そのようなタイプミスはキャッチして編集する必要があります。 –

3

を短い答えは:はい、それは動作します次のようにSimpleInjectorHttpDependencyResolverを登録することができ

var services = GlobalConfiguration.Configuration.Services; 
var controllerTypes = services.GetHttpControllerTypeResolver() 
    .GetControllerTypes(services.GetAssembliesResolver()); 

foreach (var controllerType in controllerTypes) 
{ 
    container.Register(controllerType); 
} 

。次のコードスニペットを使用することができ、APIコントローラであなたのタイプにアクセスするには

var container = new Container(); 

//Register you types in container here 

container.RegisterMvcControllers(Assembly.GetExecutingAssembly()); 
container.RegisterMvcAttributeFilterProvider(); 

var controllerTypes = 
from type in Assembly.GetExecutingAssembly().GetExportedTypes() 
where typeof(ApiController).IsAssignableFrom(type) 
where !type.IsAbstract 
where !type.IsGenericTypeDefinition 
where type.Name.EndsWith("Controller", StringComparison.Ordinal) 
select type; 

foreach (var controllerType in controllerTypes) 
{ 
    container.Register(controllerType); 
} 

container.Verify(); 
DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container)); 

::以下は、(部分的に上記のスティーブンの応答に基づいて)のWeb APIとMVC4両方のコントローラで私のプロジェクトのために動作するコードスニペットです

DependencyResolver.Current.GetService<InterfaceName>() 
関連する問題