Asp.net mvc 依赖于具有Ninject和MVC的服务层

Asp.net mvc 依赖于具有Ninject和MVC的服务层,asp.net-mvc,dependency-injection,ninject,Asp.net Mvc,Dependency Injection,Ninject,我在尝试使用Ninject时遇到了一个使用MVC的bog标准三层项目的问题。我有一个MemberRepository: public class MemberRepository : IMemberRepository{ public bool Save(Member member){ //saves member } } public class AccountController : Controller { IMemberService _

我在尝试使用Ninject时遇到了一个使用MVC的bog标准三层项目的问题。我有一个MemberRepository:

public class MemberRepository : IMemberRepository{
     public bool Save(Member member){
          //saves member
     }
}
public class AccountController : Controller
{
    IMemberService _memberService;

    public AccountController(IMemberRepository memberRepo)
    {
        _memberService = new MemberService(memberRepo);
    }
}
然后我有了我的服务层:

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 MemberRepository : IMemberRepository{
     public bool Save(Member member){
          //saves member
     }
}
public class AccountController : Controller
{
    IMemberService _memberService;

    public AccountController(IMemberRepository memberRepo)
    {
        _memberService = new MemberService(memberRepo);
    }
}
或者两者都有

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

    kernel.Bind<IMemberRepository>().To<SqlMemberRepository>();
kernel.Bind().To();
但现在我想知道是否需要注册IMemberService并将repo作为某种参数


:It’他觉得有点失落。希望我说得有道理,有人能帮上忙。

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

服务层是向控制器公开的东西——控制器不需要了解底层存储库。流程如下,每个层都不知道上面的层:

控制器->服务>存储库

因此,我将使用选项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);
     }
}

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

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

由于服务和存储库都是依赖项,因此最佳做法是将它们都注入控制器中。这会让它有一个旋转。谢谢你,伊恩,你过得怎么样?运气好吗?