cho*_*bo2 1 dependency-injection ninject ioc-container repository-pattern asp.net-mvc-2
我有3个项目文件
webui - controllers and views
framework - service layer and repos
tests- unit tests
Run Code Online (Sandbox Code Playgroud)
所以我看到的是我的控制器只会与我的服务层(包含我的业务逻辑)对话.服务层将与repos通信并获取数据库数据.
我的回购只会说数据库并返回数据.
现在,如果我想进行单元测试,我需要有假的服务层和假存储库.
通过这种方式,我可以隔离地测试控制器和服务层.
那么我在哪里将我的ninject代码放在我的框架类库中,以便我可以将它与我的服务层一起使用?
编辑
史蒂文,你说我应该这样做
//使用mvc扩展在全局aspx中设置ninject
//现在绑定东西
private class SportsStoreServices : NinjectModule
{
public override void Load()
{
Bind<IAdminService>().To<AdminService>();
Bind<IAdminRepo>().To<AdminRepo>();
}
}
Run Code Online (Sandbox Code Playgroud)
//控制器
public class AccountController : Controller
{
//
// GET: /Account/
private IAdminService adminService;
public AccountController(IAdminService adminService)
{
this.adminService = adminService;
}
public ActionResult Login()
{
var getAllAdmins = adminService.GetAllAdmins();
return View();
}
}
Run Code Online (Sandbox Code Playgroud)
//服务层
public class AdminService : IAdminService
{
private IAdminRepo adminRepo;
public AdminService(IAdminRepo adminRepo)
{
this.adminRepo = adminRepo;
}
public List<Admins> GetAllAdmins()
{
return adminRepo.GetAllAdmins();
}
}
//Repo
public class AdminRepo : IAdminRepo
{
public List<Admins> GetAllAdmins()
{
// some query to get all admins
}
}
Run Code Online (Sandbox Code Playgroud)
正确(完全)遵循依赖注入模式时,您需要引用IoC容器的唯一位置是您的应用程序根目录(在您的情况下是您的Web项目).对于MVC,您通常会ControllerFactory知道如何使用特定的IoC框架创建新的控制器.您的控制器将围绕构造函数注入进行设计,因此您的IoC框架能够自动注入所有依赖项.您通常会在整个项目中使用构造函数注入.这允许您让其余的代码不知道选择的IoC实现.
对于单元测试,通常使用构造函数注入来手动注入依赖项.这使您无需为单元测试配置IoC框架.在测试项目中使用IoC库很痛苦,因为您经常希望每个测试用例返回不同的依赖项,并且测试框架通常并行运行测试.所以最好不要在测试中使用任何IoC框架,而是自己调用被测试类型的构造函数.
使用DI进行单元测试的技巧是保持单元测试的可维护性.例如,您可以通过将测试中的类型的创建提取到工厂方法中来执行此操作.这允许您在代码中的一个位置调用此类构造函数.当构造函数更改时,您将不得不在一个位置更改测试代码.我从"单元测试的艺术 "一书中学到了很多关于编写可维护单元测试的知识.我可以推荐它.
| 归档时间: |
|
| 查看次数: |
1430 次 |
| 最近记录: |