2014-12-19 48 views
2

我試圖在每次WCF調用後嘗試使用windsor來實現所有業務邏輯服務(Ninject只是沒有工作),我有以下容器類:Castle Windsor重新創建實例

public class LDSWindsorContainer : WindsorContainer 
    { 
     public LDSWindsorContainer() 
     { 
      AddFacility<WcfFacility>(). 
       Register(
        Component.For<IDomainService>().ImplementedBy<DomainService>().LifeStyle.PerWcfOperation(), 
        Component.For<IChangeLogService>().ImplementedBy<ChangeLogService>().LifeStyle.PerWcfOperation(), 
        Component.For<ILogService>().ImplementedBy<LogService>().LifeStyle.PerWcfOperation(), 
        Component.For<ICentreInformationService>() 
         .ImplementedBy<CentreInformationService>() 
         .LifeStyle.PerWcfOperation().OnCreate(x=>Debug.WriteLine("Created")), 
        Component.For<ICentreService>().ImplementedBy<CentreService>().LifeStyle.PerWcfOperation(), 
        Component.For<ITimeZoneService>().ImplementedBy<TimeZoneService>().LifeStyle.PerWcfOperation(), 
        Component.For<IBrandService>().ImplementedBy<BrandService>().LifeStyle.PerWcfOperation(), 
        Component.For<IPricingService>().ImplementedBy<PricingService>().LifeStyle.PerWcfOperation(), 
        Component.For<IDirectoryService>() 
         .ImplementedBy<DirectoryService>().LifestyleSingleton()); 
     } 
    } 

之外的所有IDirectoryService及其實施的對象是我的商業邏輯服務,最後一個是一個WCF服務本身,我有以下的Application_Start()方法:

  public class Global : System.Web.HttpApplication 
     { 

      protected void Application_Start(object sender, EventArgs e) 
      { 
       var container = new LDSWindsorContainer(); 
       ... 
      } 
     } 

和我的服務的構造函數如下所示:

  private ILogService Logger { get; set; } 
      private IDomainService DomainService { get; set; } 
      private ICentreInformationService CentreInformationService { get; set; } 
      private ICentreService CentreService { get; set; } 
      private ITimeZoneService TimeZoneService { get; set; } 
      private IBrandService BrandService { get; set; } 
      private IPricingService PricingService { get; set; } 

      public DirectoryService(IBrandService brandService, ITimeZoneService timeZoneService, ICentreService centreService, ICentreInformationService centreInformationService, IDomainService domainService, ILogService logger, IPricingService pricingService) 
      { 
       BrandService = brandService; 
       TimeZoneService = timeZoneService; 
       CentreService = centreService; 
       CentreInformationService = centreInformationService; 
       DomainService = domainService; 
       Logger = logger; 
       PricingService = pricingService; 
      } 

我也有我的DirectoryService.svc和Web.config中對應的線 -

Factory="Castle.Facilities.WcfIntegration.DefaultServiceHostFactory, Castle.Facilities.WcfIntegration  

<system.webServer> 
     <modules runAllManagedModulesForAllRequests="true" > 
      <add name="PerRequestLifestyle" type="Castle.MicroKernel.Lifestyle.PerWebRequestLifestyleModule, Castle.Windsor" /> 
     </modules> 
</system.webServer> 

到目前爲止,問題是:我的情況越來越下不爲例(對於第一個調用),工作正常,處理通話結束,並沒有重新實例化所有即將到來的調用,所以基本上我只是得到一個例外與處理對象的工作,任何想法非常讚賞,第提前和你聯繫。

+2

目錄服務被配置爲單身,但在每個請求配置注入的依賴關係,所以這是我認爲的正常行爲。您需要根據網絡請求製作您的目錄服務生活方式,或者讓您的其他服務單身。 – 2014-12-19 12:54:24

+0

不幸的是,在這種特殊情況下,我不能改變服務的行爲,但需要利用每個請求DI的優勢,所以我仍然在這裏尋找一個選項 – HardLuck 2014-12-19 12:57:45

+0

當你說你不能改變行爲時,你的意思是你不能改變服務的生活方式?目錄服務也需要是單身人士嗎? – 2014-12-19 13:01:52

回答

0

好了,所以經過一番掙扎後,我能在這裏找到一個完美的答案 -

我的容器設置:

 AddFacility<TypedFactoryFacility>().Register(Component.For<IDomainService>().ImplementedBy<DomainService().LifeStyle.PerWcfOperation(), 

    AddFacility<WcfFacility>().Register(Component.For<IDirectoryService>().ImplementedBy<DirectoryService>().LifestyleSingleton()); 

哪裏IDomainService是我的業務邏輯的服務,我想每個請求後處置和IDirectoryService是我的WCF服務。

我的服務sontructor

public DirectoryService(Func<IDomainService> domainService) 
    { 
     DomainServiceFactory = domainService; 
    } 

和一些糖,以避免所有呼叫重命名:

private Func<IDomainService> DomainServiceFactory { get; set; } 

    private IDomainService DomainService 
    { 
     get { return DomainServiceFactory(); } 
    } 
+0

大概你有這些每個依賴之一?一個有趣的解決方案,但似乎你正在將有關IDomainService生命週期的知識/假設嵌入到DirectoryService中。IoC/DI通常是關於解耦依賴關係,而這種解決方案雖然允許進行類型替換,但卻使得事情緊密耦合。例如,如果您的某個依賴項的生命週期從PerWcfOperation更改爲Transient,那麼您的服務可能會失敗。 – 2014-12-23 04:23:52

+0

那麼所有的東西都不會被改變爲transient,因爲它打算在每個請求之後處理服務,所以我的db上下文查詢不會被緩存。 – HardLuck 2014-12-23 17:44:54

+0

您正在處理Mark Seemann提到的作爲Captive Dependency問題:http://blog.ploeh.dk/2014/06/02/captive-dependency/是的,您的解決方案將工作,但是非常脆弱,讓我想知道用DI添加什麼價值。看來這裏發生的事情對於稍後維護此代碼的人來說非常混亂。 – 2014-12-23 21:55:33