Как сделать Ninject Provider, если конструктор типа не известен? - PullRequest
1 голос
/ 14 сентября 2009

Я решил попытаться придумать контейнерную сборку для взаимодействия с 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);
}

В методе создания моего провайдера:

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 вводить соответствующие зависимости?

Это использует Ninject 2b, так как FubuMvc требует CommonServiceLocator служба поддержки.

1 Ответ

0 голосов
/ 16 сентября 2009

Неважно, я обнаружил, что делаю что-то более сложное, чем должно было быть. Вот мой новый метод создания:

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;
}

Все, что мне нужно было сделать, это просто получить конкретные типы поведения, и все были счастливы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...