asp.net-mvc - 使用 Ninject 和 MVC 对服务层的依赖

标签 asp.net-mvc dependency-injection ninject

我在尝试使用 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/

相关文章:

ASP.NET MVC-如何将数组传递给 View ?

c# - MVC3 Visual Studio 2010 中的嵌套文件夹

c# - 处理异常 .NET MVC 保留表单数据

c# - 异步任务中的 HttpContext.Current null

c# - 如何使用 ninject 在 HttpModule 中注入(inject)依赖项?

javascript - 如何从 Controller 发送多个 JSON 结果以查看?

c# - 如何在没有 DI 的情况下在紧密耦合的业务/数据层上启用单元测试?

android - Transfuse 与 Dagger 相比如何?

c# - 如何通过 C# TestFrameworks 使用 DI 框架中的 AOP? (不适用于被测项目)

c# - 如何在 C# 类库中使用 Ninject