San*_*dro 2 c# dependency-injection onion-architecture
我有一个接口IApplicationConfig,它基本上包含ConnectionStrings,例如数据库,Blob存储和其他内容。对于我的解决方案中的每个“可执行”项目,例如网站,命令行工具等,都有该接口的具体实现,该接口配置为通过依赖项注入来解决。
我的问题是,我应该将这些IApplicationConfig实施放在哪里?
在每个“可执行”项目中,我web.config/ 旁边app.config?或者在基础设施,如Project1Config.cs,Project2Config.cs等?
我在其中一个应用程序中实现管理配置的方式如下,该应用程序是按照Onion Architecture的规则进行构造的。
在这种特殊情况下,我正在考虑将配置(例如,日志记录)作为基础设施来考虑,因此这显然不是我的应用程序核心的一部分。这是因为它是另一层。
为了说明基础设施问题,请看下面的图表:
*图片来源于Shawn J Lee的博客。
在这里,您可以看到日志记录发生在基础结构切片或基础结构层中,我已经说过,管理配置也是一个基础结构问题。
现在,如果需要掌握配置管理器实现,那么在体系结构中的任何地方,只需IApplicationConfig在构造函数中索取您的信息,并根据您喜欢的DI容器/框架中的配置注入正确的实现即可。这被称为好莱坞原则或更好的控制反转。
你说够bab吗?现在让我们直接进行技术演示...
您已经问过将实际实现放在哪里。我将这些位构造为:
昏昏欲睡吗?现在让我们转向更高的档位。
我将在此处尝试简要说明实际的实现细节。
在这一层中,您放置了应用程序核心(以及其他层)将要使用或使用的所有接口。
说我们有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)
将接口协定及其实现分开,在这里您只需要添加对以下内容的引用:
现在,您可以在所需的任何层中使用实现。
这个例子来自我的一个实际应用,如果您不同意命名,我同意……这不是一件容易的事。
| 归档时间: |
|
| 查看次数: |
928 次 |
| 最近记录: |