学习在MVC中实现DIC
问题描述:
我正在学习将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中?
非常感谢您的帮助!
答
我想这里有两个问题。首先,如何与Ninject或Windsor建立客户依赖关系解析器。其次,依赖关系是否建模正确。
我会在一对夫妇的第一个问题的链接指向你,因为它已经回答了相当不错这里SO和博客文章:
在第二个问题,恕我直言,我不认为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
}
然后,你会做在控制器中的映射。
非常感谢。我现在想到了:D – Tom 2012-07-09 10:19:56
@Tom很高兴帮助。我在想这个更多。我想我会选择返回一个新的“简报”对象,以便您仍然可以查找积分和交易。然后将'Briefing'映射到'BriefingViewModel'。然后,你有一个干净的分离。 – 2012-07-09 11:16:22
谢谢指出。我理解你的想法。其实,我原来的全尺寸计划是app.website - >视图模型 - > app.services - > domain.services - > domain.data模型和存储库...其中domain.services组织数据模型,app.services层图他们查看模型...或更胖的视图模型可以维护数据模型并管理它们...那么我认为整个事情并不是那么干,而我想出了第二个计划。 – Tom 2012-07-10 08:46:13