1

この投稿で、Mike Wasson は次のように述べています。

" ParameterBindingAttribute のほかに、カスタム HttpParameterBinding を追加するための別のフックがあります。HttpConfiguration オブジェクトについて"

しかし、Web API アプリには次の 3 つの HttpConfiguration オブジェクトがあります。

public static void Register(HttpConfiguration config, IWindsorContainer container) <-- in WebApiConfig.cs
private static void MapRoutes(HttpConfiguration config) <-- ""
public static void ConfigureWindsor(HttpConfiguration configuration) <-- in Global.asax.cs

これら (構成、構成、または構成) のどれを使用する必要がありますか (存在する場合)?

アップデート

「if」行にブレークポイントを付けて、これを試しました:

public static void ConfigureWindsor(HttpConfiguration configuration)
{
    _container = new WindsorContainer();
    _container.Install(FromAssembly.This());
    _container.Kernel.Resolver.AddSubResolver(new CollectionResolver(_container.Kernel, true));
    var dependencyResolver = new WindsorDependencyResolver(_container);
    configuration.DependencyResolver = dependencyResolver;

    if (configuration.Properties.Values.Count > 0) // <-- I put a Casey Jones here
    {
        object o = configuration.Properties.Values.ElementAt(configuration.Properties.Values.Count - 1);
        string s = o.ToString();
    }
}

...しかし、サーバーの起動時に一度だけその場所にヒットしましたが、クライアントがリクエストを送信したときではありません...サーバーがリクエストを通過したときに発生するイベントがいくつかあるに違いありません。調べた...いいえ?

4

1 に答える 1

2

通常、GlobalConfiguration.Configuration から取得した HttpConfiguration のインスタンスは 1 つしかありません。

そうは言っても、それがカスタムバインダーをプラグインした方法です

global.asax 内

var binderMappings = new Dictionary<Type, Type>
    {
        {typeof(YourModelType), typeof(YourModelTypeBinder)},
        //....
    };

config.Services.Add(
    typeof(ModelBinderProvider),
    new WindsorModelBinderProvider(container, binderMappings));

WindsorModelBinderProvider

public class WindsorModelBinderProvider : ModelBinderProvider
{
    private readonly IWindsorContainer _container;
    private readonly IDictionary<Type, Type> _binderMappings;

    public WindsorModelBinderProvider(IWindsorContainer container, IDictionary<Type, Type> binderMappings)
    {
        _container = container;
        _binderMappings = binderMappings;
    }

    public override IModelBinder GetBinder(HttpConfiguration configuration, Type modelType)
    {
        IModelBinder binder = null;
        if (_binderMappings.ContainsKey(modelType))
        {
            binder = _container.Resolve(_binderMappings[modelType]) as IModelBinder;

            if (binder == null)
            {
                throw new ComponentNotFoundException(modelType);
            }
        }

        return binder;
    }
}   

YourModelTypeBinder

public class YourModelTypeBinder : IModelBinder
{
    public YourModelTypeBinder(IYourServiceToLoadYourModelType service)
    {
        //...
    }

    public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
    {
        bindingContext.Model = YourCustomCodeToLoadYourModelTypeUsingTheConstructorDependecies(actionContext.Request);
        return true;
    }

    private YourModelType YourCustomCodeToLoadYourModelTypeUsingTheConstructorDependecies(HttpRequestMessage requestMessage)
    {
        ...
    }
}

YourModelTypeBinder はコンテナーによって解決されるため (WindsorModelBinderProvider を参照)、最初に登録する必要があります。

すべての配管の後、コントローラーには、特に次のようなパラメーターがある場合があります。

[ModelBinder]YourModelType user
于 2014-02-03T11:19:51.040 に答える