17

SimpleInjectorIOCコンテナは初めてです。MVC 4 ASP.NETWebAPIを使用したマルチテナントASP.NETMVC実装を必要とするプロジェクトで作業を開始します。

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

4

2 に答える 2

24

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

現在、MVC4 Web APIはサポートされていませんが、将来的にサポートが追加される予定です。これが発生すると、統合ガイドが更新されます。


更新WebAPIサポートがSimpleInjector2.5に追加されました。


System.Web.Http.Dependencies.IDependencyResolverそれまでの間、 SimpleInjectorの独自の実装を作成できます。以下は、IISでホストされている環境でWebAPIを操作するための実装です。

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()
    {
    }
}

Webホスト環境(リクエストが開始した場所とは異なるスレッドで終了する可能性がある)内でスコーピングを実装するには、 Per Web Api Requestの有効期間を使用する必要があるため、この実装はスコーピングを実装しません。

Web APIの設計方法のため、すべてのWebAPIコントローラーを明示的に登録することが非常に重要です。これは、次のコードを使用して実行できます。

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

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

SimpleInjectorHttpDependencyResolver次のように登録できます。

// NOTE: Do this as last step, after registering the controllers.
GlobalConfiguration.Configuration.DependencyResolver = 
    new SimpleInjectorHttpDependencyResolver(container); 
于 2012-06-29T09:42:25.590 に答える