繁体   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