繁体   English   中英

.Net Core DI 对我不起作用并抛出 Null 参考异常

[英].Net Core DI Does Not Work For Me And Throws Null Reference Exception

我是 .net 核心的新手,需要您的帮助。 下面是我的实现不起作用

主程序

    static void Main(string[] args)
    {

        var serviceProvider = new ServiceCollection()
            .AddLogging()
            .AddTransient<ICustomLogger, TextWriterLogger>()
            .BuildServiceProvider();

        StartAsyncTest(args);
    }

    public async static void StartAsyncTest(string[] args)
    {

        HttpAsyncTest.SetupCommand dto = new HttpAsyncTest.SetupCommand();
        HttpAsyncTest.ExecuteCommand executeCommand = new HttpAsyncTest.ExecuteCommand();
        var test = executeCommand.ExecuteAsync(new HttpAsyncTest(dto));
        await test;
    }

我的执行命令在另一个名为 AsyncTest.Domain 的 .Net Core Class 库中

public partial class HttpAsyncTest : IValidEntity, IBuisnessEntity
{
    public HttpAsyncTest(SetupCommand dto)
    {
        HttpRequestContainers = new List<HttpAsyncRequestContainer>();
        this.Setup(dto);
    }

    private ICustomLogger _logger;
    public HttpAsyncTest(ICustomLogger logger)
    {
        _logger = logger;
    }

    async public Task ExecuteAsync(ExecuteCommand dto)
    {
         _logger.Log // throws null reference exception 
    }
}

ILogger 接口位于域 class 库中,其实现位于基础结构库中,并且该域不按照 DDD 原则引用基础结构。

上面我做错了什么以及如何修复 null 引用异常。

抱歉,我是.net核心和.net核心DI的新手,需要您的指导。

因为您没有使用 DI Container 创建实例,所以_logger字段将指向NULL中的HttpAsyncTest ,并且您没有从代码中分配ICustomLogger字段。

public partial class HttpAsyncTest : IValidEntity, IBuisnessEntity
{
    public HttpAsyncTest(SetupCommand dto,ICustomLogger logger)
    {
        HttpRequestContainers = new List<HttpAsyncRequestContainer>();
        _logger = logger;
        this.Setup(dto);
    }

    private ICustomLogger _logger;

    async public Task ExecuteAsync(ExecuteCommand dto)
    {
         _logger.Log;
    }
}

Main方法中,您可以通过serviceProvider DI Container object 调用,您可以从该 Container 获取HttpAsyncTest object,这将在您注册时创建一个 object。

static void Main(string[] args)
{

    var serviceProvider = new ServiceCollection()
        .AddLogging()
        .AddTransient<ICustomLogger, TextWriterLogger>()
        .AddTransient<SetupCommand>()
        .AddTransient<HttpAsyncTest>() 
        .BuildServiceProvider();
}

public async static void StartAsyncTest(ServiceProvider serviceProvider)
{

    HttpAsyncTest.ExecuteCommand executeCommand = new HttpAsyncTest.ExecuteCommand();
    var test = executeCommand.ExecuteAsync(serviceProvider.GetService<HttpAsyncTest>());
    await test;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM