我在尝试使用 Ninject 时遇到了一个使用 MVC 的沼泽标准三层项目的问题。我有一个 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 并将存储库作为某种参数。
:s 感觉有点失落。希望我说得有道理,有人可以帮忙。
最佳答案
我从未使用过 Ninject,我一直在使用 Unity,但存在相同的原则,因此希望这可能有所帮助。
服务层是暴露给 Controller 的东西—— Controller 需要对底层存储库一无所知。流程如下,每一层都不知道它上面的层:
Controller -> 服务 > 存储库
所以我会选择选项 1,然后将存储库注入(inject)到服务的构造函数中。
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;
}
}
该示例显然使用构造函数注入(inject),但如果需要,您可以使用属性/字段注入(inject)。注册依赖项时,您必须同时注册:
kernel.Bind<IMemberRepository>().To<SqlMemberRepository>();
kernel.Bind<IMemberService>().To<MemberService>();
关于asp.net-mvc - 使用 Ninject 和 MVC 对服务层的依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13341094/