【发布时间】:2017-10-06 21:55:11
【问题描述】:
我了解 .NET Core 中 DI 的基础知识,但我无法弄清楚如何将它用于多个项目。想象一下,我正在 ASP.NET Core 的 Startup 类中设置一个数据库上下文:
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<GalleryDb>();
}
我知道如何在 API 控制器中访问该上下文:
public class AlbumController : Microsoft.AspNetCore.Mvc.Controller
{
private GalleryDb _ctx;
public AlbumController(GalleryDb ctx)
{
_ctx = ctx;
}
}
但是,当 API 控制器和数据访问类之间有很多层和功能时,该怎么办?最终代码到达了我的存储库类,它实际上需要上下文。它看起来像这样:
public class AlbumRepository
{
private GalleryDb _ctx;
public AlbumRepository(GalleryDb ctx)
{
_ctx = ctx;
}
public void Save(AlbumEntity entity)
{
// Use _ctx to persist to DB.
}
}
我知道我可以将上下文从 API 入口点一直向下传递,但这似乎是一种反模式,因为这意味着通过多个对它不感兴趣的类和函数将其作为参数传递。
相反,我想在调用存储库类时执行类似的操作:
public void Save(AlbumEntity album)
{
var ctx = DependencyResolver.GetInstance<GalleryDb>();
var repo = new AlbumRepository(ctx);
repo.Save(album);
}
我相信一些 DI 框架有类似的东西,但我正试图弄清楚如何使用原生 .NET Core 2.0 来做到这一点。这可能吗?最佳做法是什么?我发现一个线程 (ASP.NET Core DependencyResolver) 谈论使用 IServiceProvider,但暗示这不是一个理想的解决方案。
我希望无论解决方案是什么,我都可以将其扩展到其他 DI 类,例如 ASP.NET Identity 的 RoleManager 和 SignInManager。
【问题讨论】:
-
您应该(几乎)永远不需要调用容器本身。到处使用构造注入。因此,您永远不需要
new对象的任何实例(有一些例外,即当您需要仅在运行时知道的参数时,您通常使用抽象工厂)
标签: dependency-injection asp.net-core .net-core asp.net-core-2.0