使用 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<>
我无法让我的 Func 成功通过。我在 startup.cs
中注入 webapiservices.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<>