【问题标题】:External config file to be used by multiple DLLs多个 DLL 使用的外部配置文件
【发布时间】:2011-02-26 07:09:30
【问题描述】:

我有多个 DLL 用于将数据读/写到我的数据库中。

有一个表示层 DLL 和一个数据访问层 DLL。我希望这些 DLL 共享一组连接字符串。

我的想法是将连接字符串存储在外部配置文件中的单独 DLL 中。我不确定这是否是一个好主意,以及我是否可以在表示层和数据访问层中引用该外部 DLL。

另一个问题是我是否应该编写一个帮助类来从外部配置文件中读取数据,或者我是否应该使用内置的 .Net 方法?

谢谢

【问题讨论】:

标签: c# web-config dependencies app-config config


【解决方案1】:

将配置文件访问代码隔离在一个单独的类中。通过该类上的接口使配置数据(连接字符串等)可用。让界面存在于共享程序集中。让任何需要此接口的类通过dependency injection 获得对配置类实例的引用。如果您还没有使用 DI 框架,我强烈推荐 Autofac

你取得了什么成就?表示和数据访问类现在只依赖于共享接口定义。他们不关心该接口的实现是什么,无论它是从 web.config、machine.config 还是其他存储中读取连接字符串。更好的是,您现在可以通过faking 实现更轻松地测试您的类。

更新:首先,说明如何通过界面提供配置数据。假设我们有以下配置服务:

public interface IConfigurationService
{
    string ConnectionString {get;}
}

public class ConfigurationService : IConfigurationService
{
    string ConnectionString {get;}

    public ConfigurationService()
    {
        // load configuration
    }
}

我的数据访问类可以直接使用这个类:

public class DataAccess
{
    private string _connectionString;

    public DataAccess()
    {
        var config = new ConfigurationService();
        _connectionString = config.ConnectionString;
    }
}

这种方法的问题是耦合DataAccess 现在直接依赖于 ConfigurationService 类。我们为DataAccess 编写的任何测试都会无意中受到ConfigurationService 类的影响。此外,如果我们需要切换 ConfigurationService 的实现,则需要更改 DataAccess(以及所有其他直接依赖于此类的类)。

为了解决这个问题,我们反转依赖层次结构并引用一个接口而不是具体类,如下所示:

public class DataAccess
{
    private string _connectionString;

    public DataAccess(IConfigurationService configurationService)
    {
        _connectionString = configurationService.ConnectionString;
    }
}

数据访问类现在不知道配置服务实现是什么以及该实例是如何创建的。

【讨论】:

  • 嘿!感谢您的答复。我很清楚将配置相关的代码保存在一个类中的单独 DLL 中。我熟悉接口,但我不完全确定通过接口提供配置数据是什么意思。为什么推荐依赖注入?我不能只在每个类中引用我的配置数据层吗?例如使用配置实用程序;其他一切都很有意义,非常感谢! :)
  • 很好的例子,我之前一直在考虑这个问题,如果其中一个具体类发生变化,我将不得不在多个地方进行更改!非常感谢!
【解决方案2】:

我可以将连接字符串存储在 machine.config 中,但再次不确定所有含义......

【讨论】:

    【解决方案3】:

    据我所知,DLL 文件无法使用 app.config 文件等 .net 配置项,因此如果您希望通过 xml 文件配置 dll,则必须自己编写.

    【讨论】:

    • 嘿,我应该在 web.config 中引用一个外部 .config 文件,还是应该写一个单独的层来直接读取外部 .config 文件?
    猜你喜欢
    • 1970-01-01
    • 2014-11-09
    • 1970-01-01
    • 1970-01-01
    • 2014-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多