首页 > 解决方案 > 嵌套类中的依赖注入

问题描述

我是使用依赖注入和接口的新手,我遇到了我无法弄清楚如何解决的情况。

我正在构建一个控制台应用程序,我需要在其中使用 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 和配置文件。

做这个的最好方式是什么?

标签: c#.netdependency-injection

解决方案


这仍然取决于您如何实施解决方案。

  1. 如果您计划实现 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 依赖性。

  1. 另一件事是,如果您不想使用依赖方式,那么您可以直接创建 MyClass2 的实例并传递依赖关系,但在这种情况下,您必须在方法调用中传递或需要使用 ActivatorUtilities。

注意:这完全是我的意见,可能会有所不同。


推荐阅读