我有一个类库:
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属性。我也不想明确地传递它。
我想知道是否可以使用wcf服务方法参数中的值动态解析IUser来配置Windsor?
P.S。 让我们忘记wcf暂时无法传递接口。
编辑#1 我使用Castle Project的Wcf Facility解决了这个问题。添加后丝般光滑!
答案 0 :(得分:1)
根据您设置的方式,以及您的条件,我看不出它是如何可能的。容器无法通过配置“只知道”上下文。
但是,我看到了一些选择。
首先是让你的BLFactory成为一个合适的抽象工厂,并将用户传递给它的Create方法:
public class BLFactory
{
public ISomeBL Create(IUser user)
{
return new SomeBL(user);
}
}
您也可以通过调用Resolve&lt;&gt;()并在其中传递参数或使用Windsor的Typed Factory Facility来完成此操作。引用容器直接解决工厂类中的服务通常不是一种好习惯(参见Three Calls Pattern)。
第二个选项是将用户作为方法参数传递(尽管你说你不想这样做):
public class SomeBL : ISomeBL
{
public void TestMethod(IUser user)
{
...some code using the user...
}
}
这使得SomeBL更像是一种纯粹的服务(无状态),恕我直言的更多的是DI和Windsor应该用于的。
最后一个选项假定用户代表登录用户(如果这不正确,请忽略此选项)。查看创建一个返回当前登录用户的服务,并将该服务注入您的类。您可以使用某种形式的Ambient Context来存储用户(登录或在其他位置)并通过此服务检索用户。
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.
}
}
答案 1 :(得分:0)
可以通过使用Typed Factory来完成,请参阅http://stw.castleproject.org/Windsor.Typed-Factory-Facility-interface-based-factories.ashx