c# - 嵌套类中的依赖注入
问题描述
我是使用依赖注入和接口的新手,我遇到了我无法弄清楚如何解决的情况。
我正在构建一个控制台应用程序,我需要在其中使用 serilog,并从 appsettings.json 获取设置
我有 3 个 .cs 文件。
程序.cs:
static void Main(string[] args)
{
Directory.SetCurrentDirectory(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location));
var builder = new ConfigurationBuilder();
BuildConfig(builder);
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(builder.Build())
.Enrich.FromLogContext()
.CreateLogger();
Log.Logger.Information("Starting Datacollection");
var host = Host.CreateDefaultBuilder()
.ConfigureServices((context, services) =>
{
services.AddTransient<IMyClass, MyClass>();
})
.UseSerilog()
.Build();
var svcMyClass = ActivatorUtilities.CreateInstance<MyClass>(host.Services);
svcMyClass.MyMethod();
}
IMyClass.cs:
public interface IMyClass
{
void MyMethod();
}
和MyClass.cs:
public class MyClass : IMyClass
{
private readonly ILogger<MyClass> _log;
private readonly IConfiguration _config;
public MyClass(ILogger<MyClass> log, IConfiguration config)
{
_log = log;
_config = config;
}
public void MyMethod()
{
//Do something
}
}
所有这一切都很好。我可以使用 _log 和 _config 从MyClass访问 Serilog 和配置。
但是现在需要从MyMethod中的新类( MyClass2)调用方法,并且MyClass2中的方法需要能够使用 Serilog 和配置文件。
做这个的最好方式是什么?
解决方案
这仍然取决于您如何实施解决方案。
- 如果您计划实现 IMyClass2 接口和 MyClass2 实现这个。然后这个 IMyClass2 正在服务集合中注册。
public interface IMyClass2
{
void Test();
}
public class MyClass2 : IMyClass2
{
private readonly ILogger<MyClass> _log;
private readonly IConfiguration _config;
public MyClass2(ILogger<MyClass> log, IConfiguration config)
{
_log = log;
_config = config;
}
public void Test() {}
}
现在在 MyClass 中,您可以将 IMyClass2 作为对 MyClass 的依赖注入,MyClass2 将处理它对记录器和配置的依赖。
从我的角度来看,这是一个好方法,因为您不必担心 MyClass2 依赖性。
- 另一件事是,如果您不想使用依赖方式,那么您可以直接创建 MyClass2 的实例并传递依赖关系,但在这种情况下,您必须在方法调用中传递或需要使用 ActivatorUtilities。
注意:这完全是我的意见,可能会有所不同。
推荐阅读
- c# - C# Unity 文本数组到字符串以显示在 GameScene 中
- vue.js - 如何正确使用 vue js Web 组件内部的插槽并应用样式
- c# - 值'XXX.yyyyy'的格式无效
- django - 如何将 Django-Simple-Blog 包安装到现有的 Django 项目中?
- vba - 有没有办法修改“保存已发送消息的副本”复选框以不保存已发送的项目?
- javascript - 通过将测试失败的树节点映射到其子节点来修剪树
- python - 每当在源存储桶中上传 zip 文件时,AWS lambda 函数都会触发从源 s3 到目标 s3 的复制
- reactjs - 如何用反应钩子替换剥离道具并分配类名的HOC?
- java - Spring MVC 缺少请求属性
- angular - Angular Material Ripple 出现在对象内容或文本的顶部