3

Ninjectを使用しようとしているMVCを使用した標準の3層プロジェクトに問題があります。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一種の失われた感じ。私が理にかなっていて、誰かが助けてくれることを願っています。

4

1 に答える 1

6

私は 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);
     }
}

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>();
于 2012-11-12T13:37:02.063 に答える