C# 是否从单独的类库访问web.config?

C# 是否从单独的类库访问web.config?,c#,model-view-controller,class,C#,Model View Controller,Class,我正在寻找实现以下目标的好方法: 我有一个web应用程序(MVC3),带有一个单独的类库,其中包含我正在制作的CMS的后端逻辑。此CMS使用NHibernate连接到数据库。我希望用户能够在他们的web.config文件中配置connectionstring(最终甚至数据库的风格) 我要寻找的是一种从web.config文件获取连接字符串的好方法,即使DLL是完全独立的。这可能吗?我是否必须以某种方式将连接字符串传递到类库?或者在应用程序运行时我可以访问它吗 如果我必须在我的web应用程序中创建

我正在寻找实现以下目标的好方法:

我有一个web应用程序(MVC3),带有一个单独的类库,其中包含我正在制作的CMS的后端逻辑。此CMS使用NHibernate连接到数据库。我希望用户能够在他们的web.config文件中配置connectionstring(最终甚至数据库的风格)

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

如果我必须在我的web应用程序中创建一些代码来将连接字符串传递到我的类库,那么如何使这些代码尽可能可移植,这样我就不必为我的下一个web应用程序再次编写它了


非常感谢您的想法。

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

与直接从配置文件中获取信息相比,这是一个更好的选择,否则您将依赖于具有正确键的配置文件(这使得测试类变得更困难)


有关反对直接访问配置的参数,请参阅(这是非常常见的做法,但不是最佳做法)。

您可以从类库访问。这将允许您访问AppSettings和ConnectionString。

由于您使用MVC web应用程序的类库,因此类库也可以访问它。不需要其他设置。即使类库在构建时提供了一个单独的dll,它也会在当前项目中被引用。因此,类库也可以使用连接字符串。

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

我与我参与的FOSS项目的设置完全相同。它包含“核心”类库中的所有内容(甚至包括控制器和Global.asax.cs)

有很多有效的解决方案,我选择的是创建一个设置类,它本质上是一组静态属性,其中包含:

public static string ConnectionString
{
        get { return ConfigurationManager.ConnectionStrings["MYAPP"].ConnectionString; }
}
注意:确保类库中添加了System.Configuration作为参考

在应用程序内部(从HttpApplication派生的类),您可以传递设置,尽管没有什么可以阻止您将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);
}

如果这对您有任何用处,

您可以使用该类访问web.config或app.config文件中的项目。但是,在类库中,请确保从使用者(最好在构造函数中)接收任何appSettings和/或connectionString设置的键名。这样就避免了您选择消费者已经在其他地方使用的密钥名称的问题。

坏主意。配置是一个依赖项,应该直接传入@Oded-实现一个接口和向app.config添加项目一样麻烦。它还规避了.net configuration manager中内置的几个安全功能,例如加密连接字符串的能力以及应用程序无法修改web.config的事实。更不用说,每个使用你的库的人都必须学习一种新的配置方式,而不是使用行业标准。@CharlesLambert-事实上,这是一种广泛使用的技术,但这并不是一个好习惯。如果您测试数据访问层,它会强制您将配置文件添加到测试程序集中。@Oded如果您需要将配置实现传递到类中,它会强制您实现接口。我看不出麻烦有什么不同。@CharlesLambert-这与麻烦无关。这是关于有一个静态依赖性的问题。+1用于简化测试。将配置的获取与使用分开