2011-10-04 58 views
11

我正在寻找一个很好的方式来实现以下功能:从单独的类库中访问web.config?

我有一个web应用程序(MVC 3),其中包含我正在创建的CMS的后端逻辑。此CMS使用NHibernate连接到数据库。我希望用户能够在其web.config文件中配置连接字符串(并且最终甚至是数据库的风格)。

我在寻找的是从web.config文件中获取连接字符串的好方法,即使DLL是完全独立的。这可能吗?我需要将连接字符串以某种方式传递给我的类库吗?或者当应用程序运行时我能够访问它吗?

如果我必须在我的web应用程序中创建一些代码以将连接字符串传递给我的类库,那么我怎样才能使此代码尽可能便携,因此我不必再为我的下一个webapp编写它?

非常感谢您的任何想法。

回答

17

您可以将连接字符串传递给网站中类库中的类。

这是一个比直接从配置文件中获取信息更好的选择,因为否则,您将对配置文件存在依赖的确切右键(使测试类更难)。

请参阅this blog post以反对直接访问配置的参数(这是非常普遍的做法,但不是最佳实践)。

+0

+1用于简化测试。分开获取配置和使用它 – SHug

8

你可以从你的类库中访问System.Configuration.ConfigurationManager。这会让你访问AppSettings和ConnectionStrings。

+3

坏主意。配置是一个依赖项,应该直接传入。 http://www.devtrends.co.uk/blog/configuration-settings-are-a-dependency-that-should-be-injected – Oded

+2

@Oded - 实现一个界面不会比将项目添加到应用程序更麻烦的.config。它还规避了.net配置管理器中内置的一些安全功能,例如加密连接字符串的能力以及应用程序无法修改web.config的事实。更何况,使用你的图书馆的每个人都必须学习一种新的配置方式,而不是使用行业标准。 –

+0

@CharlesLambert - 这是一个广泛使用的技术并不是一个好习惯。如果您测试数据访问层,则会强制您将配置文件添加到测试程序集。 – Oded

0

由于您正在使用MVC Web应用程序的类库,它也可以访问类库。无需其他设置。即使构建类库时给出单独的dll,它也会在当前项目中引用。所以连接字符串也可用于类库。

0

我会用类似Autofac的东西给你一些IoC实现,它可以存储连接字符串的设置接口。这将允许您在应用程序启动时从web.config设置值,或者在测试中将其设置为不同的值,而无需将类库连接到web.config。

1

我与我参与的FOSS项目的设置完全相同。它包含'Core'类库中的所有内容(即使是Controllers和Global.asax.cs)。

有大量有效的解决方案,我选择了一个是创建一个设置类,它实际上是一组静态属性,里面,你必须:

public static string ConnectionString 
{ 
     get { return ConfigurationManager.ConnectionStrings["MYAPP"].ConnectionString; } 
} 

注:请确保您的类库将System.Configuration添加为参考。

内,您的应用程序(从HttpApplication的派生类)您在经过设置,但没有什么可以阻止你tighly耦合NH安装与设置类:

protected void Application_Start() 
{ 
     AreaRegistration.RegisterAllAreas(); 
     RegisterRoutes(RouteTable.Routes); 
     SetupNHibernate(); 
} 

public virtual void SetupNHibernate() 
{ 
     NHibernateRepository.Current.Configure(RoadkillSettings.DatabaseType, Settings.ConnectionString, false, Settings.CachedEnabled); 
} 

如果这是任何使用给你,the source is here.

1

你可以使用ConfigurationManager类来访问web.config或app.config文件中的项目。但是,在你的类库中,一定要从消费者(最好在构造函数中)获取任何appSettings和/或connectionString设置的键名。这样可以避免您选择消费者已在别处使用的关键名称的问题。