Внедрение зависимостей в сервисы MVC3 WCF с использованием расширений Ninject - PullRequest
1 голос
/ 11 ноября 2011

У меня есть приложение MVC3, которое должно предоставлять некоторые функции через WCF. Некоторые из этих функций имеют зависимости, и я хотел бы внедрить их с помощью Ninject, но я должен упустить что-то очевидное, поскольку это не работает. Кто-нибудь может дать подсказку? Вот что я сделал:

1) в моем приложении MVC3 я добавляю Ninject Wcf extensions через nuget.

2) Я добавляю .svc файл вроде:

<%@ ServiceHost Service="MyWeb.LookupService" 
  Factory="Ninject.Extensions.Wcf.NinjectServiceHostFactory"%>

3) Я добавляю соответствующий код как (это просто тест, поэтому я использую фиктивный интерфейс прямо здесь):

[ServiceContract]
public interface ILookupService
{
    [OperationContract]
    int GetProjectIdByCode(string sCode);
}

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class LookupService : ILookupService
{
  private readonly ISomeRepository _repository;
  public LookupService(ISomeRepository repository)
  {
    _repository = repository;
  }

  public int GetProjectIdByCode(string sCode)
  {
    //... use _repository
  }
}

4) в App_Start / NinjectMVC3.cs :

private static void RegisterServices(IKernel kernel)
{
    string sConnection = ConfigurationManager.ConnectionStrings["SomeEntities"].ConnectionString;
    // WCF
    kernel.Bind<ServiceHost>().To<NinjectServiceHost>();

    kernel.Bind<ISomeRepository>()
        .To<AConcreteRepository>()
        .WithConstructorArgument("sConnection", sConnection);
}

Теперь, когда я получаю доступ к svc, я получаю следующее исключение из Ninject:

System.ArgumentNullException не обрабатывается кодом пользователя
Сообщение = не может быть пустым Имя параметра: root Источник = Ninject
ParamName = root StackTrace: в Ninject.Infrastructure.Ensure.ArgumentNotNull (аргумент объекта, имя строки) в C: \ Projects \ Ninject \ Maintenance2.2 \ Ninject \ SRC \ Ninject \ Инфраструктура \ Ensure.cs: линия 20 в Ninject.ResolutionExtensions.GetResolutionIterator (IResolutionRoot root, тип сервиса, Func 2 constraint, IEnumerable 1 параметры, Boolean isOptional, Boolean isUnique) в C: \ Projects \ Ninject \ Maintenance2.2 \ Ninject \ SRC \ Ninject \ Синтаксис \ ResolutionExtensions.cs: строка 258 в Ninject.ResolutionExtensions.Get [T] (корень IResolutionRoot, параметры IParameter []) в C: \ Projects \ Ninject \ Maintenance2.2 \ Ninject \ SRC \ Ninject \ Синтаксис \ ResolutionExtensions.cs: строка 37 в Ninject.Extensions.Wcf.NinjectServiceHostFactory.CreateServiceHost (Тип serviceType, Uri [] baseAddresses) в C: \ Projects \ Ninject \ Maintenance2.2 \ ninject.extensions.wcf \ SRC \ Ninject.Extensions.Wcf \ NinjectServiceHostFactory.cs: линия 48 в System.ServiceModel.Activation.ServiceHostFactory.CreateServiceHost (String constructorString, Uri [] baseAddresses) в System.ServiceModel.ServiceHostingEnvironment.HostingManager.CreateService (String normalizedVirtualPath) в System.ServiceModel.ServiceHostingEnvironment.HostingManager.ActivateService (String normalizedVirtualPath) в System.ServiceModel.ServiceHostingEnvironment.HostingManager.EnsureServiceAvailable (String normalizedVirtualPath)

1 Ответ

0 голосов
/ 14 ноября 2011

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

Полагаю, сервисному хосту также нужен конструктор без параметров.

Я взглянул на фабрику хостов службы Ninject и на трассировку стека, предоставленную вами. Это выглядит как провал, когда делает следующие проверки:

      Ensure.ArgumentNotNull((object) root, "root");
      Ensure.ArgumentNotNull((object) service, "service");
      Ensure.ArgumentNotNull((object) parameters, "parameters");

Убедитесь, что вы передаете все необходимые параметры при использовании NinjectServiceHostFactory. Стоит попробовать изменить порядок регистрации.

Также перейдите по следующей ссылке здесь , которая объясняет, как использовать Ninject для размещения службы wcf.

...