我有一个ASP.NET MVC站点,它由一个解决方案中的3个项目组成:
DomainModel(类库 - 保存LINQ回购)
DomainServices(类库 - 保持业务逻辑)
WebUI(ASP.NET MVC站点)
我需要一个地方来存储我们网站的一系列设置,这些设置可以通过XML进行配置。
这应该进入哪个项目?有没有人有一个例子说明他们如何加载,然后在这些不同的项目中访问他们的设置?
我是否在包含所有设置属性的某个C#类的构造函数中加载XML文件一次?
有人可以给我一些关于在XML文件中存储设置的示例和提示,以便在多项目解决方案中使用吗?
答案 0 :(得分:8)
设置通常存储在web.config中。所有程序集都可以访问这些设置。
ConfigurationManager.AppSettings["key"]
您需要添加对System.configuration.dll的引用
答案 1 :(得分:7)
考虑使用ConfigurationSection或IConfigurationSectionHandler
来定义自己的配置结构,而不是使用仅仅是键值对集合的AppSettings。这样你就可以获得包装类的所有安全性,并且它不会使你的AppSettings混乱(并且很好地定义在你的地方)。
更好的是,定义自己的XML模式,并使用XmlSerialization / Deserialization将此文件存储在web.config之外,监听它上的更改(将其绑定到缓存,无论如何)。
如果以这种方式执行此操作,则无需修改web.config即可获取更改,因此无需重新启动Web应用程序,从而在此过程中丢失会话/缓存。
写得不好的无状态Web应用程序应该关心丢失会话/缓存 - 但总有人......:)
答案 2 :(得分:2)
我同意Mathias使用框架提供的默认方式。但是,你可以(应该,恕我直言)仍然制作某种包装类,可能在一个界面后面,以便在单元测试中进行模拟,例如:
class MyAppSettings
{
public int SomeSetting
{
get
{
return Convert.ToInt32(ConfigurationManager.AppSettings["SomeSetting"]);
}
}
}
答案 3 :(得分:1)
我会将它存储在带有界面的新服务中。
我所做的是拥有一个具有所有属性/设置的类。它还会管理XML文件。
Inversion of Control容器允许您使用依赖注入将它们注入其他类。
答案 4 :(得分:0)
在类库中定义共享属性以保存应用程序设置(Specialized.NameValueCollection
的实例)。然后在您的站点逻辑中,将此新属性从global.asax的Application_Start sub中的web.config设置为ASP.NET设置。
Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
' Code that runs on application startup
DomainModel.Common.AppSettings = ConfigurationManager.AppSettings
End Sub
这样,您就可以从类库项目中获取设置。