Blazor DI 在 .razor 和商务类中的工作方式不同。为啥?

Posted

技术标签:

【中文标题】Blazor DI 在 .razor 和商务类中的工作方式不同。为啥?【英文标题】:Blazor DI works differently in .razor and business class. Why?Blazor DI 在 .razor 和商务类中的工作方式不同。为什么? 【发布时间】:2020-11-13 07:58:48 【问题描述】:

在我的 Blazor 服务器应用程序中,我可以轻松地实例化该类,例如 .razor 部分中的 DAL 类:

@page "/"
@inject DAL.DALClass dal

并在我的 @code 范围内使用它。

但是如果我尝试在我的域逻辑类中实例化它,比如

public class ServerDesktopDTO : DesktopDTO
    
        [Inject]
        protected DAL.DALClass dal  get; set; 
...

dal 始终为空。为什么它的工作方式不同?如何使用 [Inject] 属性和 DI 容器将其注入我的班级?

【问题讨论】:

【参考方案1】:

它的工作方式不同,因为组件是由渲染引擎而不是 DI 容器创建的。 因此,Blazor 引入了InjectAttribute,渲染引擎在它创建的组件中查找InjectAttribute,并要求 DI 约束器创建相应的依赖项。但它不会查找所有具有InjectAttribute 的类。 在其他类中,如果您使用默认 DI 容器,则使用构造函数注入来提供依赖项。其他 DI 容器,例如 Unity 或 Autfac 可以为每个属性或方法注入依赖项。

【讨论】:

这种 Blazor 方式看起来像是半决定。有什么方法可以让 .NET Core DI 在我的商务舱中提供给我?无论如何,我想回到相同的旧 ASP.NET 会话来保持范围范围的依赖关系并从这里使用它。不好。 构造函数注入相当轻松,没有理由“回到Session”。 嗯...这意味着我必须将 dal 实例从 .razor 起源跟踪到我所有的业务类?所有这些类的构造函数都不再是无参数的了吗? @Mabanza 不,这意味着您需要创建一个业务服务,在该服务中将 DAL 注入到构造函数中,并将该服务注入到组件中以要求它创建您的 DTO。 我就是这样做的。但我最终是制作“组件”又名 .razor 以将该服务传递给我的业务课程。因为“组件”是 [Inject] 工作的唯一地方。Class1 现在应该有构造函数 Class1(DAL)。如果它使用 Class2 的实例,它必须将从 .razor 传播的 DAL 传递给它。所以 Class2 应该有构造函数 Class2(DAL),等等。这很尴尬。如果我错了,请纠正我。

以上是关于Blazor DI 在 .razor 和商务类中的工作方式不同。为啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Blazor 类中注入服务(AuthenticationStateProvider)

Blazor:在 Razor 文件中定义命名空间

Blazor 中的依赖注入与 Razor 组件

如何从 Blazor 服务器端应用程序中的 Razor 页面导航到 Blazor 组件?

如何从 Blazor WebAssembly 中的 Razor 页面访问 body 标签或其他标签?

blazor wasm 如何从 di 注入自定义类