- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我是 ASP.NET Core 的新手,需要一些指导。我试图找出一个简单的场景,在 ASP.NET Core 中使用应用程序设置,同时还使用简单注入(inject)器。
我首先按照说明设置我的强类型配置设置 here里克斯特拉尔。这很好用。
public class MySettings
{
public string ApplicationName { get; set; }
}
应用设置.json
{
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Debug",
"System": "Information",
"Microsoft": "Information"
}
},
"MySettings": {
"ApplicationName": "Test Service"
}
}
启动.cs
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddMvc();
// Add Options
services.AddOptions();
// Add our Config object so it can be injected
services.Configure<MySettings>(Configuration.GetSection("MySettings"));
services.AddSingleton(GetTestBroker(container));
//Simple Injector
//services.AddSingleton<IControllerActivator>(new SimpleInjectorControllerActivator(container));
//services.AddSingleton<IViewComponentActivator>(new SimpleInjectorViewComponentActivator(container));
}
在我们的其他项目中,我们正在使用 Simple Injector for DI。添加 Simple Injector 包并按照说明配置它后,我发现我的 IOptions 配置中断了。
我想知道的是,在 ASP.NET Core 中实现配置并同时使用另一个 DI 库(如 Simple Injector)的最佳实践是什么?
最佳答案
ASP.NET Core integration guide for Simple Injector陈述如下:
.NET Core contains a new configuration model based on an
IOptions<T>
abstraction. We advise against injectingIOptions<T>
dependencies into your application components. Instead let components depend directly on configuration objects and register those objects as instances (usingRegisterInstance
). This ensures that configuration values are read during application start up and it allows verifying them at that point in time, allowing the application to fail fast.Letting application components depend on
IOptions<T>
has some unfortunate downsides. First of all, it causes application code to take an unnecessary dependency on a framework abstraction. This is a violation of the Dependency Inversion Principle, which prescribes the use of application-tailored abstractions. Injecting anIOptions<T>
into an application component makes such component more difficult to test, while providing no additional benefits for that component. Application components should instead depend directly on the configuration values they require.Second,
IOptions<T>
configuration values are read lazily. Although the configuration file might be read upon application start up, the required configuration object is only created whenIOptions<T>.Value
is called for the first time. When deserialization fails, because of application misconfiguration for instance, such error will only be appear after the call toIOptions<T>.Value
. This can cause misconfigurations to stay undetected for much longer than required. By reading—and verifying—configuration values at application start up, this problem can be prevented. Configuration values can be injected as singletons into the component that requires them.To make things worse, in case you forget to configure a particular section (by omitting a call to
services.Configure<T>
) or when you make a typo while retrieving the configuration section (e.g. by supplying the wrong name toConfiguration.GetSection(name)
), the configuration system will simply supply the application with a default and empty object instead of throwing an exception! This may make sense when building framework or third-party components, but not so much for application development, as it easily leads to fragile applications.Because you want to verify the configuration at start-up, it makes no sense to delay reading it, and that makes injecting
IOptions<T>
into your application components sub optimal, to say the least. Depending onIOptions<T>
might still be useful when bootstrapping the application, but not as a dependency anywhere else in your application. TheIOptions<T>
architecture is designed for the framework and its components, and makes most sense in that particular context—not in the context of line-of-business applications.Once you have a correctly read and verified configuration object, registration of the component that requires the configuration object is as simple as this:
MyMailSettings mailSettings =
config.GetSection("Root:SectionName").Get<MyMailSettings>();
// Verify mailSettings here (if required)
container.Register<IMessageSender>(
() => new MailMessageSender(mailSettings));
关于c# - 如何将 ASP.NET Core 应用程序设置与简单注入(inject)器一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42012823/
主要思想是将 EF Core nuget 包添加到 .NET Core 库项目,然后在一堆应用程序(例如 ASP.NET Core、Win 服务、控制台应用程序)中使用该库,而无需在每个应用程序中配置
我想要实现的是编写一个简单的.net核心后台工作程序(.net core 3.1)的代码,在该工作程序作为Windows服务运行时,我在其中将数据写入SQL Server数据库(通过EF Core 3
关于 .Net Core SDK download page 二进制文件有什么用?它与安装程序有何不同? 最佳答案 二进制文件是 .NET Core 的编译代码。它们拥有运行 .NET Core 所需
.NET Core 和 Entity Framework Core 之间的区别?我们可以在 .NET Core 中使用 Entity Framework Core 吗?两者都有什么优势? 最佳答案 E
.NET Core 和 ASP.NET Core 到底有什么区别? 它们是相互排斥的吗?我听说 ASP.NET Core 是基于 .NET Core 构建的,但它也可以基于完整的 .NET 框架构建。
我对 ASP.NET Core 开发完全陌生。我正在尝试使用单个模型和 mysql 创建一个简单的 asp.net core Web api 来存储模型数据,然后我想使用 Swagger 将其作为 R
.NET Core 和 Entity Framework Core 之间的区别?我们可以在 .NET Core 中使用 Entity Framework Core 吗?两者都有什么优势? 最佳答案 E
好吧,作为一个新的 .net 开发生态系统,我有点迷失在核心工具、版本等方面。 有人可以解释我之间的区别吗 VS 2015 核心工具预览版 x - See here .NET Core/SDK 与否
我已阅读有关如何通过信号器核心集线器从后台服务向客户端发送通知的文档。如何从客户端接收到后台服务的通知? 后台服务应该只是一个单例。 public class Startup { public
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 4年前关闭。 Improve t
非常简单的问题: 我正在尝试创建一个像这样的谓词构建器: var predicate = PredicateBuilder.False(); 但似乎在Net Core和EF Core中不可用。
在 .NET Core 自包含应用程序 中...我们需要在 project.json 中指定运行时 (RID) 我们希望我们的应用程序针对...发布为什么会这样? .NET Core 是跨平台的,与我
如何用 iCloud Core Data 替换我现有的 Core Data?这是我的持久商店协调员: lazy var persistentStoreCoordinator: NSPersistent
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 2 年前。 Improv
今天我正在学习新的 ASP.net 核心 API 3.1,我想将我的旧网站从 MVC4 转移到 Web API。除了一件事,一切都很好。数据库连接。在我的旧网站中,我为每个客户端(10/15 数据库)
我在 Visual Studio 2015 Update 3 和 .NET Core 1.0 中工作。我有一个 .NETCoreApp v1.0 类型的 Web API 项目。当我添加一个 .NET
我一直在尝试遵循 Ben Cull ( http://benjii.me/2016/06/entity-framework-core-migrations-for-class-library-proj
当我打开我的 vs 代码程序时,我收到以下消息: 无法找到 .NET Core SDK。 .NET Core 调试将不会启用。确保 .NET Core SDK 已安装并且在路径上。 如果我安装甚至卸载
我偶然发现了一个非常奇怪的问题。每当 Web 应用程序启动时,dotnet.exe 都会使用相当多的内存(大约 300M)。然而,当它触及某些部分时(我感觉这与 EF Core 使用有关),它会在短时
ASP.NET Core Web (.NET Core) 与 ASP.NET Core Web (.NET Framework) 有什么区别? .NET Framework 是否提供 similar
我是一名优秀的程序员,十分优秀!