首页 > 解决方案 > 通过依赖注入获取 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继承我开发的每个页面模型?但是这个基类将是一个非常通用的基类,它带有日志记录、电子邮件和实际上并不相似的上下文。每次我声明一个使用它们的类时声明这些字段是一个好的架构选择吗?

标签: c#asp.net-coredependency-injectionrazor-pages

解决方案


一般来说,是的,这就是你所做的。您的依赖项正在被注入,这意味着您需要 ivars 来保存它们,并且需要构造函数来接受它们。它可以感觉到并且看起来是重复的,但这实际上是一件好事。它使您的类一目了然:您可以一目了然地快速查看该类具有哪些依赖项。

如果你愿意,你可以创建一个基类。但是,您应该注意只在您的基础类中包含真正适用于每个派生的东西。危险在于添加并非在所有情况下都实际需要的依赖项,然后现在您有一堆页面加载它们不需要且不使用的依赖项。

你也可以在这里使用抽象。例如,如果每个页面都依赖于一个上下文,但在不同的场景中可能是不同的上下文,您可以将 ivar 类型设置为DbContext,而不是您的具体上下文类型,然后您可以将其设置为DbContext. 您的记录器也是如此。您实际上想要注入ILogger<MyPageModel>,但您可以在基类上创建 ivar just ILogger,然后它将接受任何记录器。

尽管如此,当你开始这样做时,你会更难找出类的依赖关系,所以这是一个让步。就个人而言,我只会将基类用于共享逻辑(如果存在)。如果基类的唯一目的是定义一组特定的依赖项,那么它不值得拥有。


推荐阅读