使用 Asp.Net 核心 2 注入存储库时为空对象

Null object when Injecting Repository with Asp.Net Core 2

我无法让我的 Func 成功通过。我在 startup.cs

中注入 webapi
services.AddDbContext<MyDataContext>(
    options => options.UseSqlServer(DbGlobals.DevDatabase,
    b => b.MigrationsAssembly("Services.Data.EF")));

services.AddTransient<Func<IMyDataContext>, Func<MyDataContext>>();
services.AddTransient(provider => new Func<IMyDataContext>(() => provider.GetService<IMyDataContext>()));

然后在我的控制器中有以下内容;

private ClientService _service;

public ClientController(Func<IMyDataContext> context)
{
    _service = new ClientService(context);
}

我服务中的方法是;

private readonly Func<IMyDataContext> _contextFactory;

public ClientService(Func<IMyDataContext> contextFactory)
{
    _contextFactory = contextFactory;
}

public void AddClient(Client model, string userName)
{
    Func<Client> func = delegate
    {
        using (var context = _contextFactory())
        {
             ....
        }
    };

    return this.Execute(func);
}

现在通过调试,如果我检查控制器注入,我可以看到 Func 已传入并且处于服务级别 2。但是,当在 context = _contextFactory() 的 using 语句中使用它时,它变为 null ?

请问我做错了什么?

你的定义有点错误。您需要定义 IDataContext 和 DataContext 是相关的:

services.AddTransient<IDataContext, DataContext>();

现在 DI 知道如何创建 IDataContext。现在你的方法只需要在使用函数时使用服务提供者来创建它:

services.AddTransient<Func<IMyDataContext>>(provider => () 
        => provider.GetService<IMyDataContext>());

现在,当您的服务被创建时,DI 将注入您的 Func<>