2012-01-13 4 views
0

Ход вы добавляете некоторый класс на основе значения хоста запроса? Я установил Ninject MVC3 lib через Nuget. Я ищу что-то вроде этого:ASP.NET MVC3 Ninject условный ввод

private static void RegisterServices(IKernel kernel) 
{ 
    var host = get host from request; 

    if (host.StartstWith("x.")) 
    { 
     kernel.Bind<IMyInterface>().To<XImplementation>().InRequestScope(); 
    } 
    else if (host.StartstWith("y.")) 
    { 
     kernel.Bind<IMyInterface>().To<YImplementation>().InRequestScope(); 
    } 
} 

Edit: только что this answer .. есть ли другой способ, чем завод? Как и в моем примере «псевдо» выше?

Решение:

private static void RegisterServices(IKernel kernel) 
{ 
    var host = HttpContext.Current.Request.Headers["host"].ToLower(); 

    kernel.Bind<IMyInterface>().To<XImplementation>().When(ctx => host.StartsWith("x.")).InRequestScope(); 
    kernel.Bind<IMyInterface>().To<YImplementation>().When(ctx => host.StartsWith("y.")).InRequestScope(); 
} 
+0

Ни в коем случае не должны вы регистрации каждого запроса. Search Mark Seemann RRR pattern –

+0

Вы можете использовать ToMethod, ToProvider или построить собственную фабрику, если условные конструкции недостаточны. В общем, условный подход должен быть вашим первым портом захода - см. Ответ @Simon Halsey –

+0

@RubenBartelink, если я удалю .InRequestScope(), что еще не так с использованием To в сочетании с Когда, как в моем примере? Использует ли завод лучшую сыворотку? Если это так? – redman

ответ

1

Попробуйте этот путь.

Bind<IMyInterface>().To<XImplementation>().When(ctx => host.StartstWith("x.")).InRequestScope(); 
Bind<IMyInterface>().To<YImplementation>().When(ctx => host.StartstWith("y.")).InRequestScope(); 
+0

Осторожно, вы распространяли ошибку в вопросе при использовании 'host', который фактически является константой для жизни привязки. –

Смежные вопросы