gpt4 book ai didi

asp.net-mvc - NInject 和 MVC 3 - 我应该使用 DependencyResolver 而不是 [Inject] 属性吗?

转载 作者:行者123 更新时间:2023-12-02 08:55:49 27 4
gpt4 key购买 nike

最近我转向了 MVC 3 和 Ninject 2。在大多数代码中,我使用构造函数注入(inject),但有些地方我必须使用 Inject 属性。 Ninject 2 注册了自己的 IDepencyResolver 接口(interface)。我不喜欢 DependencyResolver 类成为 System.Web.Mvc 命名空间的一部分,因为它的功能与 MVC 并不严格相关,但是现在,当它存在时,我能做到

public SomeClass 
{
public IUserService UserService { get; set; }

public SomeClass()
{
UserService = DependencyResolver.Current.GetService<IUserService>();

而不是

public SomeClass 
{
[Inject]
public IUserService UserService { get; set; }

所以我不必在我的类中引用 Ninject 命名空间。 DependencyResolver 应该这样使用吗?

最佳答案

我仅将属性注入(inject)用于类正常工作不需要的依赖项,但如果用户设置它们,则可以添加一些功能。此类功能的示例是日志记录。因此,您可以拥有一个代表记录器的属性,用户可以在其中提供自己的实现,如果他不提供,该类将继续正常工作,但它根本不会记录。

对于其他一切,我使用构造函数注入(inject)。通过这种方式,您可以向使用者表明该类对某些其他服务具有必需的依赖关系。

因此,要回答您有关属性(property)注入(inject)的问题,我只需:

public SomeClass 
{
public IUserService UserService { get; set; }

public void SomeMethodWhichDoesntEnforceUserService()
{
if (UserService != null)
{
// Provide some additional functionality
}
}
}

如果您的类在没有用户服务的情况下无法正常运行:

public SomeClass 
{
private readonly IUserService _userService;
public SomeClass(IUserService userService)
{
_userService = userService;
}

public void SomeMethodWhichRequiresTheService()
{
_userService.DoSomething();
}
}

因此,在这两种情况下都没有提及任何 DI 细节。这就是控制反转的意义所在。

关于asp.net-mvc - NInject 和 MVC 3 - 我应该使用 DependencyResolver 而不是 [Inject] 属性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5019908/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com