2

WebForms プロジェクトがあり、そこに WebApi コントローラーがあります。コントローラーコンストラクターとアクションフィルターコンストラクターに注入するにはどうすればよいですか?

( ) で実装IDependencyResolverして使用しましたが、役に立ちません: 要求時にコントローラーはデフォルトのコンストラクターがないと言い、アプリケーションの開始時にフィルターは、0 引数を取るコンストラクターが含まれていないと言います。Global.asaxGlobalConfiguration.Configuration.DependencyResolver

さらに、アクションフィルターへのシングルトーンインジェクションが必要です。

ありがとう。

UPD

public class ScopeContainer : IDependencyScope
{
    protected readonly IUnityContainer _container;

    public ScopeContainer(IUnityContainer container)
    {
        _container = container;
    }

    public object GetService(Type serviceType)
    {
        return _container.IsRegistered(serviceType) ? _container.Resolve(serviceType) : null;
    }

    public IEnumerable<object> GetServices(Type serviceType)
    {
        return _container.IsRegistered(serviceType) ? _container.ResolveAll(serviceType) : new List<object>();
    }

    public void Dispose()
    {
        _container.Dispose();
    }
}

public class IoCContainer : ScopeContainer, IDependencyResolver
{
    public IoCContainer(IUnityContainer container) : base(container)
    {
    }

    public IDependencyScope BeginScope()
    {
        var child = _container.CreateChildContainer();

        return new ScopeContainer(child);
    }
}

public class Global : HttpApplication
{
    void Application_Start(object sender, EventArgs e)
    {
        RegisterRoutes();
        ConfigureApi(GlobalConfiguration.Configuration);
    }

    void ConfigureApi(HttpConfiguration config)
    {
        var unity = new UnityContainer();

        unity.RegisterInstance<ILogger>(new Logger());
        unity.RegisterType<IRepository, DbRepository>();

        config.DependencyResolver = new IoCContainer(unity);
    }

    private static void RegisterRoutes()
    {
        RouteTable.Routes.MapHttpRoute("ServiceApi", "api/{controller}/{action}");
    }
}

4

2 に答える 2

2

これは、ルートを登録する方法である可能性があると思います。

WebApi ルートは、MVC コントローラーで使用されるGlobalConfiguration.Routesではなく、を介して既定のプロジェクト例に登録されます。RouteTable.RoutesApiController が MVC ルーティング メソッドによって正しく読み込まれていない場合、依存関係リゾルバーが見つかりません。

コードを次のように変更してみてください。

public class Global : HttpApplication
{
    void Application_Start(object sender, EventArgs e)
    {
        RegisterRoutes(GlobalConfiguration.Configuration);
        ConfigureApi(GlobalConfiguration.Configuration);
    }

    void ConfigureApi(HttpConfiguration config)
    {
        var unity = new UnityContainer();

        unity.RegisterInstance<ILogger>(new Logger());
        unity.RegisterType<IRepository, DbRepository>();

        config.DependencyResolver = new IoCContainer(unity);
    } 

    private static void RegisterRoutes(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute("ServiceApi", "api/{controller}/{action}");
    }

}
于 2012-12-13T16:27:00.127 に答える