使用Ninject和MVC对服务层的依赖性

时间:2012-11-12 09:24:55

标签: asp.net-mvc dependency-injection ninject

我使用MVC的沼泽标准三层项目遇到了问题,我试图使用Ninject。我有一个MemberRepository:

public class MemberRepository : IMemberRepository{
     public bool Save(Member member){
          //saves member
     }
}

然后我有我的服务层:

public class MemberService : IMemberService{
     public bool Register(string email){
        //Do Stuff & Populate Member Object
        _repo.Save(member);
     }
}

鉴于我将使用Ninject,设置我的AccountController的最佳方式是什么。我应该将MemberService传递给构造函数,如下所示:

public class AccountController : Controller
{
    IMemberService _memberService;

    public AccountController(IMemberService memberService)
    {
        _memberService = memberService;
    }
}

或传入存储库:

public class AccountController : Controller
{
    IMemberService _memberService;

    public AccountController(IMemberRepository memberRepo)
    {
        _memberService = new MemberService(memberRepo);
    }
}

还是两者?

我最初只有一个存储库(没有服务层),但我必须实现一个服务层,而且我不确定我是如何处理这种依赖关系的。在我的NinjectWebCommon.cs文件中注册内核时。最初只是这个:

    kernel.Bind<IMemberRepository>().To<SqlMemberRepository>();

但现在我想知道是否需要注册IMemberService并将repo作为某种参数。

:s感觉有点迷茫。希望我有意义,有人可以提供帮助。

1 个答案:

答案 0 :(得分:6)

我从未使用过Ninject,我一直在使用Unity,但是存在相同的原则,所以希望这可能有所帮助。

服务层是暴露给控制器的东西 - 控制器需要对底层存储库一无所知。流程如下,每层都不知道它上面的层:

控制器 - &gt;服务&gt;存储库

所以我会选择选项1,然后将存储库注入服务的构造函数。

public class MemberService : IMemberService {
     private readonly IMemberRepository _repo;

     [Inject]
     public MemberService (IMemberRepository repo){
        this._repo = repo;
     }

     public bool Register(string email){
        //Do Stuff & Populate Member Object
        _repo.Save(member);
     }
}

public class AccountController : Controller
{
    private readonly IMemberService _memberService;

    [Inject]
    public AccountController(IMemberService memberService)
    {
        _memberService = memberService;
    }
}

该示例显然使用构造函数注入,但如果需要,可以使用属性/字段注入。注册依赖项时,您必须同时注册:

kernel.Bind<IMemberRepository>().To<SqlMemberRepository>();
kernel.Bind<IMemberService>().To<MemberService>();