【发布时间】:2009-11-10 19:21:20
【问题描述】:
我对 StructureMap 相当陌生,但我的理解是有两种方法可以从 ObjectFactory 获取实例:
- 按类型(即
ObjectFactory.GetInstance<IFoo>()) - 按类型和名称(即
ObjectFactory.GetNamedInstance<IFoo>("foo.bar"))
我已经看到大量示例展示了如何创建一个 MVC 控制器工厂,该工厂将使用 StructureMap 提供控制器实例,并且在我看到的大多数情况下,它们使用的是上面选项 #1 中的方法。
假设我们有一些控制器接受存储库/DAO 接口作为构造函数参数...
public class FooController : Controller
{
public FooController (IFooRepository fooRepository)
{
// constructor code goes here
}
}
使用接口类使我能够将该接口的任何实现“注入”到我的控制器中。如果对于两个不同的操作,我想注入不同的实现怎么办?也许在一种情况下,我需要一个用于查询 SQL Server 数据库的存储库的实现,而在另一种情况下,我需要一个从 XML 文件或通过 Web 服务调用获取数据的实现。
似乎如果您使用 ObjectFactory.GetInstance() 方法,您将被限制为仅向控制器提供存储库接口的单一实现。
但是,如果您使用命名实例,那么您最终将不得不根据 MVC 框架提供的控制器的名称来创建实例。在大多数情况下,这通常是来自 URL 的控制器名称,但这实际上取决于路由配置。这看起来可能非常混乱,并且只会随着路线数量的增加而变得更加混乱。
是否有任何替代方法可以在不使用命名实例的情况下实现不同的控制器实例化策略?只创建单独的控制器并确保任何给定控制器中的所有操作都对存储库/DAO 类的同一个具体实例有效是不是更好?
【问题讨论】: