Windsor和使用调用方法参数值的动态注入

本文关键字:动态 注入 参数 方法 调用 Windsor | 更新日期: 2023-09-27 18:22:00

我有一个类库:

 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?

p.s。让我们暂时忘记wcf不能传递接口的问题。

编辑#1我使用Castle Project的Wcf设施解决了这个问题。我加上去后光滑如丝!

Windsor和使用调用方法参数值的动态注入

根据你的设置方式和你的条件,我看不出这是怎么可能的。容器无法通过配置"只知道"上下文。

然而,我看到了一些选择。

第一个是使你的BLFactory成为一个合适的抽象工厂,并将用户传递给它的Create方法:

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

您也可以通过调用Resolve<>来执行此操作()并在那里传递参数,或者使用Windsor的Typed Factory Facility。引用容器来直接解析工厂类中的服务通常不是一个好的做法(请参阅Three Calls Pattern)。

第二种选择是将用户作为方法参数传递(尽管您说过不想这样做):

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

可以通过使用Typed Factory来完成,请参阅http://stw.castleproject.org/Windsor.Typed-Factory-Facility-interface-based-factories.ashx