2012-06-15 3 views
3

Windows 서비스 호스트에서 내 WCF 서비스를 호스팅하려고합니다. 종속성을 관리하기 위해 Castle WCF 기능을 사용하고 있습니다.WCF 종속성 구성

내 ServiceOne가로 구현됩니다
partial class DataServicesHost : ServiceBase 
    { 
     private IWindsorContainer windsorContainer; 
     public DataServicesHost() 
     { 
      InitializeComponent(); 
     } 

     protected override void OnStart(string[] args) 
     { 
      var configure = new ConfigureContainer(); 
      windsorContainer = configure.WindsorContainer; 
     } 

     protected override void OnStop() 
     { 
      if(windsorContainer != null) 
      { 
      windsorContainer.Dispose(); 
      windsorContainer = null; 
      } 
     } 
    } 

은 다음과 같습니다 :

public class ConfigureContainer : IConfigureContainer 
     { 
      private const string ServiceOne= "ServiceOne"; 
      private const string ServiceTwo  = "ServiceTwo"; 
      private const string ServiceThree = "ServiceThree"; 
      private const string CurrentAssembly  = "MyAssembly"; 

      private readonly IWindsorContainer container; 

      public ConfigureContainer(IWindsorContainer container) 
      { 
       this.container = container; 
      } 


      public IWindsorContainer WindsorContainer { get { return container; } } 


      public void AndRegisterComponents() 
      { 
       container.Register(AllTypes.FromAssemblyNamed(CurrentAssembly) 
         .Pick().If(type => type.GetInterfaces().Any(i => i.IsDefined(typeof(ServiceContractAttribute), true))) 
         .Configure(configurer => configurer 
                .Named(configurer.Implementation.Name) 
                .AsWcfService(
                 new DefaultServiceModel() 
                  .AddEndpoints(
                   WcfEndpoint.FromConfiguration(ServiceOne), 
                   WcfEndpoint.FromConfiguration(ServiceTwo), 
                   WcfEndpoint.FromConfiguration(ServiceThree)) 
                   .PublishMetadata())) 
         .WithService.Select((type, baseTypes) => type.GetInterfaces() 
          .Where(i => i.IsDefined(typeof(ServiceContractAttribute), true)))); 

      } 
     } 

이것은 내가 나의 서비스 호스트 내부에서 호스팅 할 방법은 다음과 같습니다 내 ContainerConfiguration (부트 스트 래퍼)처럼 보이는 방법

이입니다

[ServiceContract] 
    internal interface IServiceOne 
    { 
     [OperationContract] 
     void DoSomething(); 
    } 

    public class ServiceOne : IServiceOne 
    { 
     private readonly IDependency dependency; 

     public ServiceOne(IDependency dependency) 
     { 
      this.dependency = dependency; 
     } 

     public void DoSomething() 
     { 
      dependency.GetSomething(); 
      //do something 
     } 
    } 

    public interface IDependency 
    { 
     void GetSomething(); 
    } 

    public class Dependency : IDependency 
    { 
     public void GetSomething() 
     { 
      //GetSomeThing 
     } 
} 

이제 내 질문은 : 컨테이너에 IDependency를 전달하려면 어떻게해야합니까? 호스트를 구성하는 동안 호스트가 종속성을 알지 못하게하고 기본 생성자 구현을보고 실패하는 것에 대해 불평하지 않도록 어떻게 구성합니까?

덕분에, - 마이크

답변

1

당신은 WCF ServiceHost를하지 Windows 서비스 코드 내부의 WCF 서비스의 윈저 용기를 회전해야합니다. Castle WCF facilityWCF in a Windows Service에있는이 두 블로그 게시물을보고해야 할 일을 확인하십시오. 기본적으로 Windows 서비스 코드는 Castle WCF 기능에서 가져온 WCF ServiceHostFactory를 회전시키고 그 팩토리는 실제로 Castle 컨테이너를 구성합니다.

+0

다음과 같은 경우 : var hostFactory = new DefaultServiceHostFactory (Container.Kernel); var serviceHost = hostFactory.CreateServiceHost ("WcfServiceLibrary2.Service1", 새 Uri [0]); serviceHost.Open(); ...이 또한 내 문제를 해결하지 않습니다. – Mike

+0

Visual Studio 웹 서버, IIS Express 또는 IIS에서 단일 서비스를 실행하고 Castle DI 컨테이너를 사용할 수있는 코드 버전을 생성 해보십시오. 이 문제를 해결하면 다른 서비스에 사용할 패턴과 Windows 서비스에서 실행하기 위해 수행해야 할 작업을 알 수 있습니다. –