【问题标题】:ASP.NET MVC Configuration Class using IoC使用 IoC 的 ASP.NET MVC 配置类
【发布时间】:2010-12-08 11:13:31
【问题描述】:
在 MVC 应用程序中,我们需要创建整个应用程序所需的配置设置类。这是一个横切关注点,因为它需要在控制器中,有时在域逻辑的深处,以及像 HtmlHelper 扩展这样的地方。需要它的地方有很多不同的地方,这让我很受挫。
该类将包装从 web.config 中提取的设置以及数据库中的表。数据库设置查询将被缓存,所以我不担心每次请求都会受到影响。
在过去的几年里,我可能创建了一些静态类型的类或单例,但我不想失去现在的可测试性。实例化这个类然后能够通过应用程序中的几乎任何地方访问它的最佳方法是什么?
【问题讨论】:
标签:
asp.net-mvc
nhibernate
structuremap
ioc-container
【解决方案1】:
我会继续使用单例。但是一个封装了接口的单例,这也使它可测试。
public class Configuration
{
private IConfiguration _config;
public static IConfiguration Instance { get { return _config; }}
public static void Assign(IConfiguration config)
{
_config = config;
}
}
只需在 global.asax 或任何单元测试中使用 Assign。
如果您想以正确的方式进行操作,则应直接在对象的构造函数中提供配置设置。
代替
public class MyService
{
public MyService()
{
var confString = Configuration.Instance.GetConnectionString()
}
}
你会这样做:
public class MyService
{
public MyService(string confString)
{}
}
最后,我不会在 HTML 帮助程序中有任何配置依赖项。通过这样做,您正在向您的视图添加业务逻辑,这会破坏separation of concerns
【解决方案2】:
我认为 codeplex 项目 mvccontrib 提供了一些可以使用的钩子
据我所知,至少有 3 个 IOC 提供商,而不是 windsor、structurmap、spring.net ......
但我自己没有用过
在这里你可以找到更多
http://mvccontrib.codeplex.com/
也许你可以查看这个项目的源代码,看看你可以从那里去哪里......
HTH
【解决方案3】:
我会重构我的应用程序,不要到处使用配置。我只在控制器中使用配置。我的视图没有任何逻辑,我的领域模型只有业务逻辑,没有应用程序逻辑。