型のコンストラクターが不明な場合、どのようにNinjectプロバイダーを作成しますか?

StackOverflow https://stackoverflow.com/questions/1423569

質問

とやり取りするためにコンテナアセンブリを想起しようとすることにしました FubuMVC。クールな部分は、すべてのテストに合格することです FubuMVC.Container.StructureMapアセンブリは行います。しかし、私がドロップしたとき FubuSampleに入れます。アクティベーションエラーを受け取りました。

エラーの原因は、動作のプロバイダーで私が パラメーターなしのコンストラクターを呼び出して、動作インスタンスを構築します。それ 現実には受け入れられないようです。

設定方法は次のとおりです。

public class TestBehavior2 : IControllerActionBehavior
{
    public IControllerActionBehavior InsideBehavior { get; set; }
    public IInvocationResult Result { get; set; }
    protected FubuConfiguration Configuration { get; set; }
    protected FubuConventions Conventions { get; set; }

    public TestBehavior2(FubuConventions conventions, FubuConfiguration config)
    {
        Conventions = conventions;
        Configuration = config;
    }

    public OUTPUT Invoke<INPUT, OUTPUT>(INPUT input, Func<INPUT, OUTPUT> func)
        where INPUT : class
        where OUTPUT : class
    {
        // Invocation stuff
    }
}

public class TestBehavior : IControllerActionBehavior
{
    public IControllerActionBehavior InsideBehavior { get; set; }
    public IInvocationResult Result { get; set; }
    public OUTPUT Invoke<INPUT, OUTPUT>(INPUT input, Func<INPUT, OUTPUT> func)
        where INPUT : class
        where OUTPUT : class
    {
        // Invocation stuff
    }
}

My Loadメソッドには次のバインディングがあります:

foreach (var actionConfig in _configuration.GetControllerActionConfigs())
{
    Bind(actionConfig.ControllerType).ToSelf();

    Bind<IControllerActionBehavior>()
        .ToProvider(new BehaviorInstanceProvider(actionConfig))
        .WhenParentNamed(actionConfig.UniqueID);

    Bind<IControllerActionInvoker>().To(actionConfig.InvokerType)
        .Named(actionConfig.UniqueID);
}

私のプロバイダーのCreateメソッドでは:

public object Create(IContext context)
{
    var behavior = ConfigureInstance(context);
    foreach (var type in _config.GetBehaviors().Reverse())
    {
        IControllerActionBehavior previousBehavior = behavior;
        behavior = (IControllerActionBehavior)Activator.CreateInstance(type);
        t.GetProperty(INSIDE_PROP_NAME).SetValue(behavior, temp, null);
    }
    return behavior;
}

だから私の質問は、どのようにプロバイダにセットアップして コンストラクタが何をするかわからないときのサービスのインスタンス のように見える?または、ConstructorInfoを使用して確認する場合 コンストラクターは適切な依存関係を挿入しますか?

これはNinject 2bを使用しています。FubuMvcにはCommonServiceLocatorが必要なためです サポート。

役に立ちましたか?

解決

Nevermind、私はそれが必要以上に複雑になっていることを発見しました。新しいCreateメソッドを次に示します。

public object Create(IContext context)
{
    IControllerActionBehavior behavior = context.Kernel.Get<DefaultBehavior>();
    _config.GetBehaviors().Reverse().Each(t =>
                                          {
                                              var temp = behavior;
                                              behavior = (IControllerActionBehavior) context.Kernel.Get(t);
                                              t.GetProperty(INSIDE_PROP_NAME).SetValue(behavior, temp, null);
                                          });
    _type = behavior.GetType();
    return behavior;
}

私がしなければならなかったのは、具体的な行動タイプを取得するだけで、誰もが幸せでした。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top