统一 - 根据一些条件解决依赖关系

问题描述:

我已经分层的asp.net MVC应用程序。 在服务层,我有一个容器来注册依赖关系。 e.g:统一 - 根据一些条件解决依赖关系

public static void RegisterTypes(IUnityContainer container) 
    { 
     container.RegisterType<ISomething, Something>(); 
    } 

根据设计,我们需要有一个mock实现 类的,如果用户决定开放测试用的应用程序。

所以,我想出了一个主意就像

public static void RegisterTypes(IUnityContainer container) 
    { 
     container.RegisterType<ISomething, Something>(); 
     container.RegisterType<ISomething, SomethingMock>(); 
    } 

如果我使用标志的地方,能够显示系统是否在测试模式下运行时,我怎么能做出哪些依赖于解决决定运行? 如果它不是一个优雅的解决方案,可以选择什么?

虽然我完全支持史蒂文斯的回答和他的考虑,但从技术上来说,有一种方法可以实现您的目标。 您可以使用一个名为登记:

public static void RegisterTypes(IUnityContainer container) 
{ 
    container.RegisterType<ISomething, Something>(); 
    container.RegisterType<ISomething, SomethingMock>("SomethingMock"); 
} 

,然后用一个字符串参数来解决这个问题:

string s= ""; 
var mySomething = container.Resolve<ISomething>(s); // will return standard implementation 
s = "SomethingMock" 
var mySomething = container.Resolve<ISomething>(s); // will return mock implementation 

你需要的时候ASP要解决ISomething拦截。

更多信息参见 https://msdn.microsoft.com/en-us/library/ff660923%28v=pandp.20%29.aspx

现在它是由你走哪条路。

+0

我使用统一3.5,它似乎并没有工作来解决命名注册。 –

+0

我用Unity 4.0.1检查过,它工作正常,但我认为它应该也适用于旧版本。你的代码会发生什么?也许我们可以找出什么是错的。 – jps

如果我在某个地方使用标志来指示系统是否在测试模式下运行,我如何决定在运行时解决哪个依赖关系?

根据运行时决策,您不应该更改对象图的结构。这与anti-pattern of injecting runtime data into components非常相关。

在你需要基于运行时条件(意味着:该值可能从请求到请求改变)切换的实现的情况下,解决方案是创建一个实现ISomething并包装在两个ISomething实现中,代理类(this article示出了一些示例的代理实现)。当调用ISomething.Method时,它可以根据它在此处确定的运行时条件将调用转发给正确的实现。

然而,在您的情况下,您很可能不会讨论运行时状况,而是关于配置值。配置值在应用程序的生命周期中不会更改。只有在重新启动(或重新部署)后,您通常才会看到值的更改。

这意味着,你可以简单地在启动时读取配置值,并在其实施应进行登记点决定:

if (bool.Parse(ConfigurationManager.AppSettings["Production"])) 
{ 
    container.RegisterType<ISomething, Something>(); 
} 
else 
{ 
    container.RegisterType<ISomething, SomethingMock>(); 
} 
+0

感谢您的回复。我的情况是第一个。在每次请求时,我需要决定它的模拟请求还是真实请求。 关于代理类,请详细解释。我的服务层解决了业务依赖关系,每个业务都需要一些存储库类作为数据层注入。现在我只需要嘲笑数据层。 –

+1

@AhmadMousavi:请使用其他信息更新您的问题,或在SO上发布新问题,并提供所需的详细信息以回答此附加问题。您可以在[本文](https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=100)中阅读更多关于如何实现此类代理的信息。 – Steven