0

我正在学习将DIC应用于MVC项目。所以,我已经勾画出了这个DDD-ish DIC-ready-ish布局,以便更好地理解。过去几天我读过许多博客文章。但是,我对于正确实施它没有信心。您能否向我展示如何以正确的方式将它们放入DIC?在所有的阅读结果后,我更喜欢Ninject或Windsor,但只要我能够正确理解如何去做,任何DIC都会这样做。学习在MVC中实现DIC

网络控制器...

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中感受到 - > BriefingViewModel()对我来说似乎是错误的,但是我不知道如何将该stud嵌入到DIC中?

非常感谢您的帮助!

回答

2

我想这里有两个问题。首先,如何与Ninject或Windsor建立客户依赖关系解析器。其次,依赖关系是否建模正确。

我会在一对夫妇的第一个问题的链接指向你,因为它已经回答了相当不错这里SO和博客文章:

Ninject

Windsor

在第二个问题,恕我直言,我不认为IAccountServices应该有必要了解视图模型。我喜欢保持我的依赖关系在一个方向上对齐。因此,AccountBriefingController的工作就是将User(或一个名为Briefing的新模型对象)转换为BriefingViewModel。这照顾了是否要新建一个BriefingViewModel的问题。但是,您必须将User映射到控制器中的BriefingViewModel(这将需要您创建一个新实例)。否则,依赖关系对我来说确实很好。

所以我想改变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 
    } 

然后,你会做在控制器中的映射。

+0

非常感谢。我现在想到了:D – Tom 2012-07-09 10:19:56

+1

@Tom很高兴帮助。我在想这个更多。我想我会选择返回一个新的“简报”对象,以便您仍然可以查找积分和交易。然后将'Briefing'映射到'BriefingViewModel'。然后,你有一个干净的分离。 – 2012-07-09 11:16:22

+0

谢谢指出。我理解你的想法。其实,我原来的全尺寸计划是app.website - >视图模型 - > app.services - > domain.services - > domain.data模型和存储库...其中domain.services组织数据模型,app.services层图他们查看模型...或更胖的视图模型可以维护数据模型并管理它们...那么我认为整个事情并不是那么干,而我想出了第二个计划。 – Tom 2012-07-10 08:46:13