2015-05-02 3 views
1

Я уже давно использую Ninject с проектами Asp.Net MVC и работал как шарм. Но теперь, когда я хочу использовать то же самое с библиотекой услуг WCF, установив Ninject.Extensions.Wcf и Ninject.Web.Common вместо Ninject.MVC3, я получаю ниже ошибку при добавлении ссылки на службу.Ninject зависимость для ошибки wcf

System.InvalidOperationException: The service type provided could not be loaded as a service because it does not have a default (parameter-less) constructor. To fix the problem, add a default constructor to the type, or pass an instance of the type to the host. 
at System.ServiceModel.Dispatcher.InstanceBehavior..ctor(DispatchRuntime dispatch, ImmutableDispatchRuntime immutableRuntime) 
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime..ctor(DispatchRuntime dispatch) 
at System.ServiceModel.Dispatcher.DispatchRuntime.GetRuntimeCore() 
at System.ServiceModel.Dispatcher.ChannelDispatcher.OnOpened() 
at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) 
at System.ServiceModel.ServiceHostBase.OnOpen(TimeSpan timeout) 
at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) 
at Microsoft.Tools.SvcHost.ServiceHostHelper.OpenService(ServiceInfo info) 

Это мой WCF конструктор класса -

private TestDBContext _dbContext; 

    public TestService(TestDBContext ctx) 
    { 
     _dbContext = ctx; 
    } 

А вот как я добавить зависимость в NinjectWebCommon -

kernel.Bind<TestDBContext>().To<TestDBContext>().InRequestScope(); 

Что еще требуется здесь? Как это исправить?

Благодаря

Редактировать: Весь NinjectWebCommon

private static readonly Bootstrapper bootstrapper = new Bootstrapper(); 

    /// <summary> 
    /// Starts the application 
    /// </summary> 
    public static void Start() 
    { 
     DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule)); 
     DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule)); 
     bootstrapper.Initialize(CreateKernel); 
    } 

    /// <summary> 
    /// Stops the application. 
    /// </summary> 
    public static void Stop() 
    { 
     bootstrapper.ShutDown(); 
    } 

    /// <summary> 
    /// Creates the kernel that will manage your application. 
    /// </summary> 
    /// <returns>The created kernel.</returns> 
    private static IKernel CreateKernel() 
    { 
     var kernel = new StandardKernel(); 
     try 
     { 
      kernel.Bind<Func<IKernel>>().ToMethod(ctx =>() => new Bootstrapper().Kernel); 
      kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>(); 

      RegisterServices(kernel); 
      return kernel; 
     } 
     catch 
     { 
      kernel.Dispose(); 
      throw; 
     } 
    } 

    /// <summary> 
    /// Load your modules or register your services here! 
    /// </summary> 
    /// <param name="kernel">The kernel.</param> 
    private static void RegisterServices(IKernel kernel) 
    { 
     kernel.Bind<TestDBContext>().To<TestDBContext>().InRequestScope(); 
    } 

App.config

https://gist.github.com/anonymous/ad0da985773c145f2b30

+0

Это выглядит довольно прямо вперед, но Тереза ​​до сих пор не описание того, как служба WCF загрузился, как с * SVC-файл и/или web.config. –

+0

Это библиотека wcf, поэтому не содержит .svc. Он загружается с помощью App.config. Сообщите мне, какая часть этого требуется для вашей отладки. – Sam

+0

Хорошо. Не могли бы вы добавить сюда app.config? Я думаю, что это проблема с фабрикой. –

ответ

0

Исключение связано с Ninject не бутстрапированная правильно. Когда bootstrapping WCF не может найти конструктор без параметров, он выдает это исключение.

Попробуйте удалить параметр TestDBContext ctx с вашего TestService и посмотреть, будет ли он работать, как тест.

Чтобы решить эту проблему, вы должны убедиться, что Ninject действительно правильно настроен для WCF. Добавление следующей строки в web.config:

<serviceHostingEnvironment> 
    <serviceActivations> 
     <add factory="YourNamespace.NinjectFileLessServiceHostFactory" service="YourNamespace.TestService" relativeAddress="./TestService.svc"/> 
    </serviceActivations> 
</serviceHostingEnvironment> 

создания Также завод:

public class NinjectFileLessServiceHostFactory : NinjectServiceHostFactory 
{ 
    public NinjectFileLessServiceHostFactory() 
    { 
     SetKernel(NinjectWebCommon.Bootstrapper.Kernel); 
    } 
} 

Чтобы сделать Bootstrapper доступны здесь вы должны изменить его для всеобщего доступа в NinjectWebCommon. АОЛО забудьте добавить требуемое связывание в RegisterServices:

public static class NinjectWebCommon 
{ 
    public static readonly Bootstrapper bootstrapper = new Bootstrapper(); 

    // ... 

    private static void RegisterServices(IKernel kernel) 
    { 
     kernel.Bind<ServiceHost>().To<NinjectServiceHost>(); 
     // ... 
     } 
} 
+0

Я знаю, что он будет работать, если я удалю параметр, но это не вопрос. Я ищу использовать dbcontext в библиотеке wcf, поэтому приближаюсь к Ninject. – Sam

+0

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

+0

Да, он работает после удаления параметра. Я тестировал это раньше. – Sam

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