Visual Studio 解决方案中项目之间的依赖项注入

laik7k3q  于 2023-02-16  发布在  其他
关注(0)|答案(2)|浏览(232)

我试图将Serilog的依赖注入到多个项目的解决方案中,以便所有项目都可以使用它。
带有Program.cs的My Entryproject启动了一个工作者服务

string workingDirectory = AppDomain.CurrentDomain.BaseDirectory;
string logName = "\\ServiceHub_" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".log";
string logPathAndName = workingDirectory + logName;

ILogger logger = SetupLogging(logPathAndName);
logger.Information($"Current Working Domain: {workingDirectory}");

ILogger SetupLogging(string logFileName)
{
    // Setup Logging
    ILogger logger = Log.Logger = new LoggerConfiguration()
        .WriteTo.Console(outputTemplate: "[{Timestamp:yyyy-MM-dd HH:mm:ss}] {Level:u3} - {Message:lj}{NewLine}{Exception}")
        .WriteTo.File(logFileName, outputTemplate: "[{Timestamp:yyyy-MM-dd HH:mm:ss}] - {Level:u3} {Message:lj}{NewLine}{Exception}")
        .CreateLogger();
    return logger;
} 

try{
    using IHost host = Host.CreateDefaultBuilder(args)
        .ConfigureAppConfiguration(app =>
        {
            app.AddJsonFile($"appsettings.json");

        })
        .ConfigureServices((hostContext, services) =>
        {
            services.AddHostedService<WorkerService>();
            services.AddSingleton<IInterface1, Class1>();
            services.AddSingleton<IInterface2, Class2>();
        })
        .UseSerilog()
        .Build();
} catch (Exception ex){
{....}

await host.RunAsync();

这是解决方案中一个项目的一部分。我希望能够使用注入的Serilog,例如,通过在另一个项目中拥有ctor(ILogger logger),这是同一个解决方案的一部分,但无论我做什么或读什么,我似乎都无法破解代码。其他项目已经得到了对这个项目的引用。但当我示例化一个类时,我必须将(New Serilog.Logger)放在参数列表中。
我希望这是有意义的。谁能给我指一下正确的方向?
先谢谢你。

d8tt03nd

d8tt03nd1#

DI并不真正了解或关心项目,它只关心类。
你应该能够从容器中解析依赖于ILogger接口的其他类。但是依赖注入容器不是魔术,你需要在任何时候创建对象时使用容器。例如:

public class MyClass
{
    private readonly ILogger logger;
    public MyClass(ILogger logger) => this.logger = logger;
}
...
var serviceCollection = new ServiceCollection();
serviceCollection.AddSingleton(SetupLogging("test"));
serviceCollection.AddTransient<MyClass>();
var container = serviceCollection.BuildServiceProvider();
var myObj = container.GetService<MyClass>();

当类的数量开始增加时,多个项目可能会使事情变得更加复杂。最终,您可能希望将类的注册移动到每个项目中,或者创建某种类型的“模块”,其中包含一些更大的功能分组。一些单元测试可能也很有用。根据我的经验,一个常见的问题是一些项目忘记注册依赖项。2尽早发现这样的问题是很有用的。

qlvxas9a

qlvxas9a2#

你可以注册你的依赖接口与各自的实现到入口项目和注入接口作为依赖到其他项目.例如,创建一个项目,你可以定义你的接口ILogger,这将是共同的所有项目&创建一个其他项目LoggerUtility和做接口的实现,并注册这个实现的类与各自的接口在入口项目和注入Ilogger在其他项目.

相关问题