[英]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.