2013-10-18 156 views
1

我想讓Castle Windsor DI與作爲Windows服務託管的WCF服務一起工作。我已經對這裏的方法DI與Windows服務中的Castle Windsor託管WCF服務

WCF Service Library hosted as a Windows Service using Castle.Windsor 3.0 issue

不過,我的問題是,如果我的服務實現類不具有默認參數的構造函數,ServiceHost的不會讓我在OnStart中創建的這個實例()。如果我提供一個無參數的構造函數,服務控制檯將使用該構造函數啓動服務,所以我沒有注入任何依賴項。

代碼如下

public class WindowsService : ServiceBase 
    { 
     public ServiceHost ServiceHost; 

     public WindowsService() 
     { 
      ServiceName = "CRMCustomerService"; 
     } 

     public static void Main() 
     { 
      // Bootstrap the Castle Windsor DI setup 
      Run(CreateContainer().Resolve<ServiceBase>()); 
     } 

     #region Service methods 

     protected override void OnStart(string[] args) 
     { 
      if (ServiceHost != null) 
      { 
       ServiceHost.Close(); 
      } 

      ServiceHost = new ServiceHost(typeof(CustomerService)); 
      ServiceHost.Open(); 
     } 

     protected override void OnStop() 
     { 
      if (ServiceHost != null) 
      { 
       ServiceHost.Close(); 
       ServiceHost = null; 
      } 
     } 


     #endregion 

     #region Private Methods 

     private static IWindsorContainer CreateContainer() 
     { 
      var container = new WindsorContainer(); 
      container.Install(FromAssembly.This()); 
      return container; 
     } 

     #endregion 
    } 

[ServiceBehaviorAttribute(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Single)] 
    public class CustomerService : ICustomerService 
    { 
     private readonly IDataRepository _repository; 
     private readonly ILogger _logger; 

     public CustomerService(IDataRepository repository) 
     { 
      _repository = repository; 
      _logger = new RootLogger(Level.Error); 
     } 
} 

public class ServicesInstaller : IWindsorInstaller 
    { 
     public void Install(IWindsorContainer container, IConfigurationStore store) 
     { 
      container 
       .AddFacility<WcfFacility>(f => 
               { 
                f.CloseTimeout = TimeSpan.Zero; 
               }) 
       .Register(
        Component 
         .For<IDataRepository>() 
         .ImplementedBy<CustomerRepository>() 
         .LifeStyle.Transient 
         .AsWcfService(), 
        Component.For<ServiceBase>().ImplementedBy<WindowsService>()); 
     } 
    } 

有人能看到我在做什麼錯?我想在服務啓動時以及WCF服務的一個實例創建時引導Windsors DI容器,以便在此時注入依賴關係。

回答

0

你可以有兩個構造函數。無參數的參數調用將依賴作爲參數的重載。

public WindowsService() 
    this(new ServiceHost()); 

public WindowsService(ServiceHost serviceHost) 
{ 
    this.ServiceHost = serviceHost; 
} 
0

你可以實例化服務實現與所需的構造函數,並把它傳遞給服務主機作爲參數,例如

var service = CustomerService(container.Resolve<IDataRepository>()); 
ServiceHost = new ServiceHost(service); 

,甚至這樣的,如果你已經正確配置容器:

var service = container.Resolve<ICustomerService>(); 
ServiceHost = new ServiceHost(service); 

然而,在這種情況下,將在單模式下工作,我記得你需要改變InstanceContextMode的服務實施到單一

1

1)您應該有兩個構造函數作爲另一個海報建議,一個 默認和一個與您的依賴關係作爲參數。

2)當你在你連接到你應該使用城堡的WCF基金 主機服務(請注意您 鏈接到崗位AsWcfService語法後見)。所有你需要做的就是編寫城堡代碼,註冊 你所有的服務依賴關係,Castle將會照顧 休息。這幾乎像魔術一樣!