2013-10-01 2 views
3

Что такое правильный способ использовать Ninject с WebServiceHost (при размещении в IIS)Что такое правильный способ использовать Ninject с WebServiceHost

Пожалуйста, обратите внимание, что у меня нет НИКАКОГО SVC-файла и не хочу. Поэтому у меня есть неограниченный URL. Я использую Ninject для ввода репо и т. Д. В службу. В то время как это работает Я не могу вспомнить, как я это делал раньше, и то, как я это делаю сейчас, неверно - его фактически работает как самостоятельная организация - мне нужна услуга для участия в конвейере IIS (используйте тот же порт, запуск/завершение работы с AppPool) ...

Я добавил ссылку на Ninject.Extensions.WCF, которая создала NinectWebCommon.cs в моей папке App_Start. В том, что я разводке услуги следующим образом (но я не хочу, чтобы указать URL/порт, и я хочу, чтобы участвовать в собственном жизненном цикле)

private static void RegisterServices(IKernel kernel) 
{ 
    var port = 8080; 
    var uri = new Uri(String.Format("http://{0}:{1}/api", Environment.MachineName, port)); 

    var baseAddr = new Uri[] { uri }; 
    var binding = new WebHttpBinding(WebHttpSecurityMode.None); 
    var endPoint = new ServiceEndpoint(ContractDescription.GetContract(typeof(MyServiceClassHere)) 
     , binding, new EndpointAddress(uri)); 

    kernel.Bind<IProjectRepository>().To<MyRepo>(); 

    kernel.Bind<WebServiceHost>().To<NinjectWebServiceHost>() 
     .WithConstructorArgument("serviceType", typeof(MyServiceClassHere)) 
     .WithConstructorArgument("baseAddresses", baseAddr); 

    var webBehavior = new WebHttpBehavior() { HelpEnabled = true }; 
    endPoint.Behaviors.Add(webBehavior); 

    _host = kernel.Get<WebServiceHost>(); 
    _host.AddServiceEndpoint(endPoint); 
    _host.Open(); 
} 

Может ли вы помочь мне с лучшей практикой подключение службы с помощью Ninject.

Заранее спасибо.

ответ

0

Этот блог помог мне получить Ninject и работает в моей WCF службы размещенного в IIS: http://www.aaronstannard.com/post/2011/08/16/dependency-injection-ninject-wcf-service.aspx

мне пришлось переопределить метод Load на NinjectModule:

public class WCFNinjectModule : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<IProjectRepository>().To<MyRepo>(); 
    } 
} 

, а затем в global.asax, мне пришлось переопределить метод CreateKernel().

protected override IKernel CreateKernel() 
    { 
      StandardKernel kernel = new StandardKernel(new WCFNinjectModule()); 
      kernel.Bind<Func<IKernel>>().ToMethod(ctx =>() => new Bootstrapper().Kernel); 
      kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>(); 
      return kernel; 
    } 
Смежные вопросы