【发布时间】:2015-08-30 11:45:41
【问题描述】:
条件解析是我目前不明白的最后一件事。
假设我们有一个接口IAuthenticate:
public interface IAuthenticate{
bool Login(string user, string pass);
}
现在我有两种类型的身份验证。
推特认证
public class TwitterAuth : IAuthenticate
{
bool Login(string user, string pass)
{
//connect to twitter api
}
}
Facebook 身份验证
public class FacebookAuth: IAuthenticate
{
bool Login(string user, string pass)
{
//connect to fb api
}
}
在统一配置中注册类型:
unityContainer.RegisterType<IAuthenticate, TwitterAuth>();
unityContainer.RegisterType<IAuthenticate, FacebookAuth>();
在我们的控制器中通过 DI 注入对象:
private readonly IAuthenticate _authenticate;
public AuthenticateController(IAuthenticate authenticate)
{
_authenticate = authenticate;
}
// login with twitter
public virtual ActionResult Twitter(string user, string pass)
{
bool success =
_authenticate.Login(user, pass);
}
// login with fb
public virtual ActionResult Facebook(string user, string pass)
{
bool success =
_authenticate.Login(user, pass);
}
// login with google
public virtual ActionResult Google(string user, string pass)
{
bool success =
_authenticate.Login(user, pass);
}
unity 究竟如何知道它必须为不同类型的身份验证解析哪个对象?在这种情况下如何进行条件解析?
我和我的朋友谈过,如果出现这种情况,他解释说是设计错误,但这只是使用的工厂模式。
【问题讨论】:
-
你的朋友可能是对的。如果您没有违反Liskov Substitution Principle,请仔细查看。如果
IAuthenticate的实现不能相互互换(这意味着像AuthenticateController这样的消费者如果得到错误的实现将无法正常工作),那么您就违反了LSP。这种情况下的解决方案通常是为每个实现提供自己的抽象。 -
@Steven 我认为 LSP 是关于使用 'child' 而不是 'parent',而不是使用 'child1' 而不是 'child2' (或者“每个可证明的关于 'parent' 的属性都应该是对每个孩子都为真”意味着“关于 'child1..n' 的每个可证明的属性都应该对 'child1..n' 为真”?)
标签: c# dependency-injection inversion-of-control unity-container