簡體   English   中英

使用調用方法參數值的Castle.Windsor和動態注入

[英]Castle.Windsor and dynamic injection using calling method parameters values

我有一個課程庫:

 public class SomeBL : ISomeBL
 {
    private IUser myUser;
    public SomeBL(IUser user)
    {
      myUser = user;
    }
    public void TestMethod()
    {
       ...some code using the user...
    }
 }

我在此代碼庫中還有一個工廠:

public class BLFactory
{
    public static ISomeBL SomeBL
    {
        get { return ServiceLocator.Current.GetInstance<ISomeBL>(); }
    }
}

然后,我有一個帶有以下服務的單獨的wcf應用程序:

public class MyWcfService : IMyWcfService
{
       public void TestMethod(User user)
       {
            BLFactory.SomeBL.TestMethod();
       }
}

如您所見,我需要IoC來正確解析SomeBL構造函數級別的IUser屬性。 我也不想明確地傳遞它。

我想知道是否可以通過以下方式配置Windsor:使用wcf服務方法的參數值動態地解析IUser?

ps讓我們忘記一下wcf暫時無法傳遞接口的情況。

編輯#1我使用Castle Project的Wcf設備解決了它。 添加后像絲綢一樣光滑!

根據您的設置方式以及您的條件,我不知道這是怎么可能的。 容器無法通過配置“僅知道”上下文。

但是,我看到了一些選擇。

首先是使您的BLFactory成為適當的抽象工廠,並將用戶傳遞給其Create方法:

public class BLFactory  
{  
    public ISomeBL Create(IUser user)
    {              
        return new SomeBL(user);   
    }  
}  

您也可以通過調用Resolve <>()並在其中傳遞參數,或使用Windsor的Typed Factory Facility來執行此操作。 引用容器直接解決工廠類中的服務通常不是一個好習慣(請參見三調用模式 )。

第二種選擇是將用戶作為方法參數傳遞(盡管您說您不想這樣做):

 public class SomeBL : ISomeBL        
 {        
    public void TestMethod(IUser user)        
    {        
       ...some code using the user...        
    }        
 }   

這使SomeBL更像是純服務(無狀態),而IMHO更像是應使用DI和Windsor的路線。

最后一個選項假定用戶代表登錄的用戶(如果不正確,請忽略此選項)。 查看創建返回當前已登錄用戶的服務並將該服務注入您的類的服務。 您將使用某種形式的環境上下文來存儲用戶(在登錄時或其他時間)並通過此服務檢索用戶。

 public class SomeBL : ISomeBL               
 {               
    private IUser _userservice;               
    public SomeBL(IUserService userservice)               
    {               
      _userservice = userservice;               
    }               
    public void TestMethod()               
    {               
       IUser currentUser = _userService.GetCurrentUser();
    }
 }

 public interface IUserService
 {
   IUser GetCurrentUser();
 }

 public class UserService : IUserService
 {
   public IUser GetCurrentUser
   {
      //pull user from Thread, HttpContext.CurrentRequest, cache, session, etc.
   }

 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM