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

Luk*_*Led 2 asp.net-mvc dependency-injection ninject ninject-2 ninject.web.mvc

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

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

    public SomeClass()
    {
        UserService = DependencyResolver.Current.GetService<IUserService>();
Run Code Online (Sandbox Code Playgroud)

代替

public SomeClass 
{
    [Inject]
    public IUserService UserService { get; set; }
Run Code Online (Sandbox Code Playgroud)

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

Dar*_*rov 5

我只使用属性注入来执行类的正常工作所不需要的依赖项,但是如果用户设置它们可以添加一些功能.此类功能的示例是日志记录.所以你可以拥有一个代表记录器的属性,用户可以在其中提供自己的实现,如果他没有,则该类继续正常工作,但它根本不记录.

对于其他一切,我使用构造函数注入.这样,您向消费者指示此类对某些其他服务具有必需的依赖性.

所以要回答你关于物业注入的问题,我会简单地说:

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

    public void SomeMethodWhichDoesntEnforceUserService()
    {
        if (UserService != null)
        {
            // Provide some additional functionality
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果没有用户服务你的班级无法正常运作:

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

    public void SomeMethodWhichRequiresTheService()
    {
        _userService.DoSomething();
    }
}
Run Code Online (Sandbox Code Playgroud)

所以在这两种情况下都没有参考任何DI细节.这就是控制倒置的全部意义所在.