2016-01-07 5 views
3

У меня есть единство контейнер:Почему сервер службы Unity.Wcf не может правильно решить проблему?

var unityContainer = new UnityContainer(); 

настроен следующим образом:

unityContainer.RegisterType<IExampleDomainService, ExampleDomainService>(); 

unityContainer.RegisterType<IExampleWebService, ExampleWebService>(); 

ExampleWebService типа и его конструктора выглядит следующим образом:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 
public class ExampleWebService 
{ 
    public ExampleWebService(IExampleDomainService exampleDomainService) 
    { 
     this.exampleDomainService = exampleDomainService; 
    } 

// ... 

и ExampleDomainService не имеет конструктора определена (по проблема такая же, когда я явно определяю конструктор без параметров для этого типа).

Далее, как описано в Unity.Wcf-х documentation:

Если вы хостинг вашей службы WCF внутри службы Windows с помощью ServiceHost, замените экземпляр ServiceHost с обычаем Unity.Wcf.UnityServiceHost. Вы обнаружите, что UnityServiceHost берет в контейнере Unity в качестве первого параметра, но в остальном идентичен по умолчанию ServiceHost.

я сделать следующее:

var host = new UnityServiceHost(unityContainer, typeof(ExampleWebService), baseAddress); 

Это, однако, проливает System.InvalidOperationException со следующим сообщением:

тип услуги, предоставляемые не может быть загружен в качестве службы, поскольку он не имеет default (параметр-less). Чтобы устранить проблему, добавьте конструктор по умолчанию к типу или передайте экземпляр типа на хост.

Глядя на UnityServiceHost implementation at GitHub она проходит с учетом serviceType (typeof(ExampleWebService) в данном случае) непосредственно WCF родной ServiceHost:

public sealed class UnityServiceHost : ServiceHost 
{ 
    public UnityServiceHost(IUnityContainer container, Type serviceType, params Uri[] baseAddresses) 
     : base(serviceType, baseAddresses) 
      ^^^^^^^^^^^ 
      ??????????? 

, который, очевидно, аварии, а ServiceHost ничего не говорит о единстве и его емкости не знают и не могут справиться когда отсутствует конструктор без параметров.

Unity.Wcf полностью поврежден для хостинга, отличного от WAS/IIS, или (надеюсь) Я делаю что-то совершенно неправильное?

ответ

1

Прошу прощения, я не могу сказать вам, почему у вас есть ваше исключение, но я надеюсь вам помочь.

  1. ServiceHost не нужно ничего знать о Единстве. DI сделано через реализации IInstanceProvider и его регистрации для каждого поведения службы
  2. Это просто работа для меня, здесь очень простое приложение которые работают правильно, может быть, вы можете найти то, что проблема на вашей стороне

    public class Program 
    { 
        static void Main(string[] args) 
        { 
         var container = new UnityContainer(); 
         container.RegisterType<IDependency, Dependency>(); 
         container.RegisterType<IHelloWorldService, HelloWorldService>(); 
         Uri baseAddress = new Uri("http://localhost:8080/hello"); 
         using (ServiceHost host = new UnityServiceHost(container, typeof(HelloWorldService), baseAddress)) 
         { 
          ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); 
          smb.HttpGetEnabled = true; 
          smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15; 
          host.Description.Behaviors.Add(smb); 
    
          host.Open(); 
    
          Console.WriteLine("The service is ready at {0}", baseAddress); 
          Console.WriteLine("Press <Enter> to stop the service."); 
          Console.ReadLine(); 
    
          host.Close(); 
         } 
        } 
    } 
    
    [ServiceContract] 
    public interface IHelloWorldService 
    { 
        [OperationContract] 
        string SayHello(string name); 
    } 
    
    public interface IDependency 
    { 
    
    } 
    
    public class Dependency : IDependency { } 
    
    public class HelloWorldService : IHelloWorldService 
    { 
        private readonly IDependency _dependency; 
    
        public HelloWorldService(IDependency dependency) 
        { 
         _dependency = dependency; 
        } 
    
        public string SayHello(string name) 
        { 
         return string.Format("Hello, {0}", name); 
        } 
    } 
    
  3. WCF не звонит InstanceProvider если InstanceContextMode.Single б/у. Вот почему Unity.WCF не работает с ним.Подробный ответ можно найти here.

+0

Спасибо за ваш ответ, я попробую это. Не могли бы вы указать, какую версию Unity.Wcf вы используете? – BartoszKP

+0

@BartoszKP Я тестировал https://www.nuget.org/packages/UnityWCF/2.0.5849.32640, но я думаю, что он очень похож на тот, который у вас есть – Uriil

+0

Сторона примечания: похоже, что более старая версия на NuGet называется Unity .Wcf (обратите внимание на точку) - это тот, который я использовал. Я перешел на вашу версию, и я попытаюсь выяснить разницу между вашей реализацией и моей. – BartoszKP