2009-09-14 11 views
1

Я решил попытаться вызвать в виде контейнера сборку для взаимодействия с FubuMVC. Ну, крутая часть - это то, что она проходит весь тест, который делает сборка FubuMVC.Container.StructureMap. Однако, когда я сбросил в FubuSample. Я получил ошибку активации.Как сделать поставщика Ninject, когда конструктор типа не известен?

Ошибка в том, что в провайдере для поведения я всего лишь , вызывающий конструктор без параметров для создания экземпляров поведения. То, что неприемлемо в реальной жизни, казалось бы.

Вот как это настраивается:

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

Мой метод 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 .

+0

Не могли бы вы предоставить пример кода? Я не уверен, как именно вы используете провайдера? –

+0

Обратите внимание, что Ninject разрешит любые аргументы в конструкторе вашего провайдера, если это возможно. –

ответ

0

Ничего, я обнаружил, что делаю вещи сложнее, чем это должно было быть. Вот мой новый метод 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; 
} 

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