支持可注入模拟对象但也使用语句c#的类

时间:2015-10-07 13:52:34

标签: c# unit-testing

如何在Using语句中创建一个包装所有EF存储库调用的类,同时还支持存储库的可注入接口?

我无法理解这个类支持2种不同类型的实例化。

pool.map

本质上,“db”的生命周期。 object是方法调用的生命周期。然而,' db'如果注入,将在课外管理。

2 个答案:

答案 0 :(得分:2)

你可以用这种方式构建它:

#! /bin/bash

## create an example command to launch for demonstration purposes
function mycommand { D=$(date) ; while true ; do echo $D; sleep 1s ; done; }

while true
   do
   mycommand & PID=$!
   sleep 6m
   kill $PID ; wait $PID 2>/dev/null
   done

您需要一种将public class MyClass { private readonly IRepo _repo; //or if you want a parameterless constructor... public MyClass() : this(new Repo()) { } public MyClass(IRepo repo) { _repo = repo; } public MyObject MyMethod(int id) { _repo.GetById(id); } } public interface IRepo { MyObject GetById(int id); } public class Repo : IRepo { public MyObject GetById(int id) { using ( var db = new DbContext()) { //do your db related stuff here } } } 的实例注入Repo的方法,所以可以看看IoC。

这样,您可以轻松地模拟MyClass以进行测试。

答案 1 :(得分:0)

你不应该这样做。拥有Repo的无参数构造函数,并在那里实例化DbContext。您也可能需要DbContext的超载,但您不必这样做。关键是让每一层都只担心它自己需要什么。让IOC容器在创建时注入所有内容,不要为方法中的不同层创建对象。