在洋葱体系结构中将ConnectionStrings放在哪里

San*_*dro 2 c# dependency-injection onion-architecture

我有一个接口IApplicationConfig,它基本上包含ConnectionStrings,例如数据库,Blob存储和其他内容。对于我的解决方案中的每个“可执行”项目,例如网站,命令行工具等,都有该接口的具体实现,该接口配置为通过依赖项注入来解决。

我的问题是,我应该将这些IApplicationConfig实施放在哪里?

在每个“可执行”项目中,我web.config/ 旁边app.config?或者在基础设施,如Project1Config.csProject2Config.cs等?

kay*_*ess 5

前言

我在其中一个应用程序中实现管理配置的方式如下,该应用程序是按照Onion Architecture的规则进行构造的。

在这种特殊情况下,我正在考虑将配置(例如,日志记录)作为基础设施来考虑,因此这显然不是我的应用程序核心的一部分。这是因为它是另一层。

哲学课程

为了说明基础设施问题,请看下面的图表:

洋葱架构图

*图片来源于Shawn J Lee的博客。

在这里,您可以看到日志记录发生在基础结构切片或基础结构层中,我已经说过,管理配置也是一个基础结构问题。

现在,如果需要掌握配置管理器实现,那么在体系结构中的任何地方,只需IApplicationConfig在构造函数中索取您的信息,并根据您喜欢的DI容器/框架中的配置注入正确的实现即可。这被称为好莱坞原则或更好的控制反转。

你说够bab吗?现在让我们直接进行技术演示...

实施概述

您已经问过将实际实现放在哪里。我将这些位构造为:

  • 应用核心层
    • 域接口组装
  • 基础设施层
    • 配置组装
    • 依赖性解析程序集
  • UI层
    • 命令行汇编
    • 网站组装

昏昏欲睡吗?现在让我们转向更高的档位。

实施实例

我将在此处尝试简要说明实际的实现细节。

域接口组装

在这一层中,您放置了应用程序核心(以及其他层)将要使用或使用的所有接口。

说我们有IApplicationConfig.cs

public interface IApplicationConfig
{
    ConnectionStringSettingsCollection GetConnectionStrings();
}
Run Code Online (Sandbox Code Playgroud)

配置组装

在这里您可以拥有IApplicationConfig接口的实际实现。将其作为单独的程序集存在疑问,但实际上这只是实现细节,我亲自将所有配置管理实现存储在此处。

例如,的实现IApplicationConfig可以是ApplicationConfig.cs

public class ApplicationConfig : IApplicationConfig
{
    public ConnectionStringSettingsCollection GetConnectionStrings()
    {
        return ConfigurationManager.ConnectionStrings;
    }
}
Run Code Online (Sandbox Code Playgroud)

依赖性解析程序集

您可以在此处将接口与所需的实现“链接”。在这里,我使用Ninject并为其创建了一个Ninject模块,将其称为ConfigModule,这是一个简单的示例:

public class ConfigModule : NinjectModule
{
    Bind<IApplicationConfig>().To<ApplicationConfig>();
}
Run Code Online (Sandbox Code Playgroud)

最后是命令行/网站程序集

通常,这些是合成根或组成对象图的应用程序的入口点。话虽如此,我们现在只需要加载我们的Ninject模块:

private static IKernel CreateKernel()
{
    var kernel = new StandardKernel();

    var modules = new List<INinjectModule>
        {
            new ConfigModule(),
            new WhateverModule(),
            ...
        };

    kernel.Load(modules);
}
Run Code Online (Sandbox Code Playgroud)

您需要添加命令行/网站程序集的参考

将接口协定及其实现分开,在这里您只需要添加对以下内容的引用:

  • 依赖性解析程序集
  • 域接口组装

现在,您可以在所需的任何层中使用实现。

后记

这个例子来自我的一个实际应用,如果您不同意命名,我同意……这不是一件容易的事