c# - 通过依赖注入获取 dbcontexts 背后的 10 多个剃须刀页面代码
问题描述
我开发了一个C# ASP.NET Core MVC
包含很多razor pages
. 我的大多数剃须刀页面都使用日志记录、发送电子邮件并使用多个 dbcontextes。
很多类是这样的:
class A : PageModel
{
private readonly ADbContext _context;
private readonly UserManager<ApplicationUser> _userManager;
private readonly IEmailSender _emailSender;
private readonly ILogger<MyModel> _logger;
public UpdateModel(ADbContext context,
UserManager<ApplicationUser> userManager,
IEmailSender emailSender,
ILogger<MyModel> logger)
{
_context = context;
_userManager = userManager;
_emailSender = emailSender;
_logger = logger;
}
}
我有 10 多页这样的页面。当我创建一个页面时,我必须添加这些字段。所以很多时候。
摆脱大量字段声明的理想方法是什么?Abase class
继承我开发的每个页面模型?但是这个基类将是一个非常通用的基类,它带有日志记录、电子邮件和实际上并不相似的上下文。每次我声明一个使用它们的类时声明这些字段是一个好的架构选择吗?
解决方案
一般来说,是的,这就是你所做的。您的依赖项正在被注入,这意味着您需要 ivars 来保存它们,并且需要构造函数来接受它们。它可以感觉到并且看起来是重复的,但这实际上是一件好事。它使您的类一目了然:您可以一目了然地快速查看该类具有哪些依赖项。
如果你愿意,你可以创建一个基类。但是,您应该注意只在您的基础类中包含真正适用于每个派生的东西。危险在于添加并非在所有情况下都实际需要的依赖项,然后现在您有一堆页面加载它们不需要且不使用的依赖项。
你也可以在这里使用抽象。例如,如果每个页面都依赖于一个上下文,但在不同的场景中可能是不同的上下文,您可以将 ivar 类型设置为DbContext
,而不是您的具体上下文类型,然后您可以将其设置为DbContext
. 您的记录器也是如此。您实际上想要注入ILogger<MyPageModel>
,但您可以在基类上创建 ivar just ILogger
,然后它将接受任何记录器。
尽管如此,当你开始这样做时,你会更难找出类的依赖关系,所以这是一个让步。就个人而言,我只会将基类用于共享逻辑(如果存在)。如果基类的唯一目的是定义一组特定的依赖项,那么它不值得拥有。
推荐阅读
- dictionary - promise.all 不返回实际结果
- sharepoint - 删除相关项目字段中的“删除”和“添加相关项目”选项
- c++ - 为什么我在 OSX 终端和 Netbeans 上编译时会得到不同的结果
- java - 如何在处理中的计时器上增加全局变量?
- html - 如何在div中定位项目
- go - 在 Golang 中以编程方式模拟断开互联网连接
- python-3.x - 我如何给布尔值来决定我的时间戳是假期和周末还是不在python的Dataframe中
- java - 如何在 JNA 结构中映射联合
- amazon-web-services - 如何修改亚马逊 AWS EC2 启动模板?
- javascript - Angular PWA - 缓存远程图像