0

私はDICをMVCプロジェクトに適用することを学んでいます。そこで、私はこのDDD風のDIC対応のレイアウトを最もよく理解できるようにスケッチしました。私は過去数日間、多くのブログ記事wikiを読みました。しかし、私はそれを正しく実装することに自信がありません。それらを適切な方法でDICに入れる方法を教えていただけますか?私はすべての測定値の後でNinjectまたはWindsorを好みますが、それを行う方法について正しい考えを得ることができる限り、anyDICはそれを行います。

Webコントローラー...

public class AccountBriefingController {
    //create
    private IAccountServices accountServices { get; set; }
    public AccountBriefingController(IAccountServices accsrv)
        accountServices = accsrv;
    }   
    //do work
    public ActionResult AccountBriefing(string userid, int days) {
        //get days of transaction records for this user
        BriefingViewModel model = AccountServices.GetBriefing(userid, days);
        return View(model);
    }
}

モデルを表示..。

public class BriefingViewModel {
    //from user repository
    public string UserId { get; set; }
    public string AccountNumber {get; set;}
    public string FirstName { get; set; }
    public string LastName { get; set; } 
    //from account repository
    public string Credits { get; set; } 
    public List<string> Transactions { get; set; }
}

サービスレイヤー..。

public interface IAccountServices {
    BriefingViewModel GetBriefing();
}

public class AccountServices {
    //create
    private IUserRepository userRepo {get; set;}
    private IAccountRepository accRepo {get; set;}
    public AccountServices(UserRepository ur, AccountRepository ar) {
        userRepo = ur;
        accRepo = ar;
    }
    //do work
    public BriefingViewModel GetBriefing(string userid, int days) {
        var model = new BriefingViewModel(); //<---is that okay to new a model here??
        var user = userRepo.GetUser(userid);
        if(user != null) {
            model.UserId = userid;
            model.AccountNumber = user.AccountNumber;
            model.FirstName = user.FirstName;
            model.LastName = user.LastName;
            //account records
            model.Credits = accRepo.GetUserCredits(userid); 
            model.Transactions = accRepo.GetUserTransactions(userid, days);
        }
        return model;
    }
}

ドメインレイヤーとデータモデル...

public interface IUserRepository {
    UserDataModel GetUser(userid);
}
public interface IAccountRepository {
    List<string> GetUserTransactions(userid, days);
    int GetUserCredits(userid);
}
// Entity Framework DBContext goes under here

私の実装が間違っているかどうかを指摘してください。たとえば、AccountServices-> GetBriefing-> new BriefingViewModel()で感じることができますが、スタッドをDICに適合させる方法がわかりません。

ご助力ありがとうございます!

4

1 に答える 1

2

ここに2つの質問があると思います。まず、Ninject または Windsor を使用して顧客の依存関係リゾルバーをセットアップする方法。次に、依存関係が正しくモデル化されているかどうか。

ここで SO とブログ投稿で非常によく回答されているため、最初の質問のリンクをいくつか紹介します。

ニンジェクト

ウィンザー

IAccountServices2番目の質問については、私見ですが、ビューモデルについて知っておく必要はないと思います。依存関係を一方向に揃えるのが好きです。したがって、 (または という名前の新しいモデル オブジェクト) をAccountBriefingControllerに変換するのは の仕事です。これにより、 を新規作成するかどうかの問題が処理されます。ただし、コントローラーで aを aにマップする必要があります (これには、新しいインスタンスを作成する必要があります)。それ以外の場合、依存関係は私には問題ないように見えます。UserBriefingBriefingViewModelBriefingViewModelUserBriefingViewModel

だから私はこれに変更GetBriefingします:

public User GetBriefing(string userid, int days) {
        var user = userRepo.GetUser(userid);
        if(user != null) {
            return user;
        }
        throw new CustomException();  //if this makes sense
    }

次に、コントローラーでマッピングを行います。

于 2012-07-08T21:31:38.487 に答える