10

ASP.NET Web API nuget パッケージ用の Unity ブートストラップを使用して、カスタム ActionFilterAttribute クラスで依存関係の挿入を行うことができません。

私は UnityConfig にタイプを登録し、別の場所で使用しています (ただし、コンストラクター インジェクションを使用しています)。正常に動作します。

public static void RegisterTypes(IUnityContainer container)
{
    container.RegisterType<ISettingService, SettingService>();
    ...
}

コードは正常に呼び出されていますが、インスタンス化されたオブジェクト (settingService) は null です。

public class APIKeyValidationAttribute : ActionFilterAttribute
{
    [Dependency]
    public ISettingService settingService { get; set; }

public override void OnActionExecuting(HttpActionContext actionContext)
{
    ...
    if (settingService == null)
    {
        throw new Exception("settingService is null");
    }
    ...
}

これを機能させるにはどうすればよいですか? 私は長い間検索してきましたが、MVC または異なる依存関係インジェクターを使用した Web API の例しか見つけることができません。

4

1 に答える 1

10

最初IFilterProviderに BuildUp を実行し、依存関係を注入する を作成します。

public class UnityActionFilterProvider 
    : ActionDescriptorFilterProvider, IFilterProvider
{
    private readonly IUnityContainer container;

    public UnityActionFilterProvider(IUnityContainer container)
    {
        this.container = container;
    }

    public new IEnumerable<FilterInfo> GetFilters(
        HttpConfiguration configuration, 
        HttpActionDescriptor actionDescriptor)
    {
        var filters = base.GetFilters(configuration, actionDescriptor);

        foreach (var filter in filters)
        {
            container.BuildUp(filter.Instance.GetType(), filter.Instance);
        }

        return filters;
    }
}

次に、IFilterProvider を登録します。

private static void RegisterFilterProviders()
{
    var providers = 
        GlobalConfiguration.Configuration.Services.GetFilterProviders().ToList();

    GlobalConfiguration.Configuration.Services.Add(
        typeof(System.Web.Http.Filters.IFilterProvider),
        new UnityActionFilterProvider(UnityConfig.GetConfiguredContainer()));

    var defaultprovider = providers.First(p => p is ActionDescriptorFilterProvider);

    GlobalConfiguration.Configuration.Services.Remove(
        typeof(System.Web.Http.Filters.IFilterProvider), 
        defaultprovider);
}

このメソッドを入れて、UnityWebApiActivatorクラスで呼び出しました。

于 2013-10-02T08:26:01.050 に答える