2012-06-15 135 views
3

我想在Windows服務主機中託管我的WCF服務。爲了管理依賴關係,我使用了Castle WCF工具。配置WCF依賴關係

這是我ContainerConfiguration(引導程序)的樣子:

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)))); 

      } 
     } 

這是我做我的託管服務主機內:

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; 
      } 
     } 
    } 

我ServiceOne被實現如下:

[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傳遞給容器?我將如何配置它,以便在託管它時,它不會抱怨不讓主機知道依賴關係,並且繼續查看和故障轉移默認的構造函數實現?

感謝, -Mike

回答

1

您需要旋轉起來溫莎容器爲WCF的ServiceHost不是Windows服務代碼中的WCF服務。看看Castle WCF facilityWCF in a Windows Service上的這兩篇博文,看看你需要做什麼。基本上,Windows服務代碼只是建立了一個WCF ServiceHostFactory,您可以從Castle WCF工具中獲得該工廠,並且該工廠實際上是配置Castle容器的工具。

+0

如果你的意思是這樣的:var hostFactory = new DefaultServiceHostFactory(Container.Kernel); var serviceHost = hostFactory.CreateServiceHost(「WcfServiceLibrary2.Service1」,new Uri [0]); serviceHost.Open(); ...這也不解決我的問題。 – Mike

+0

我建議您嘗試創建一個在Visual Studio Web服務器,IIS Express或IIS下運行單個服務的代碼版本,並且可以使用Castle DI容器。一旦你解決了這個問題,那麼你就會知道用於其他服務的模式,以及你需要做什麼來在Windows服務下運行。 –