编程到接口并使用松耦合 - 研究TDD,单元测试和DI

时间:2013-10-14 16:14:09

标签: c# dependency-injection tdd

Greetins, 假设我有一个名为Formater:IFormater的类和一个方法LoadData(),如下所示:

public interface IFormater { void LoadData(string strSomeData); }
public class Formater : IFormater { public void LoadData(string strSomeData) {/*do some magic*/} }

假设我还有一个名为View:IView的类和一个方法LoadRawData(),如下所示:

public interface IView { void LoadRawData(string strSomeData); }
public class View : IView {
    private IFormater _formater;
    public View(IFormater formater) { _formater = formater; }
    public void LoadRawData(string strSomeData) { _formater.LoadData(strSomeData); }
}

现在,在我的编程中,我创建了一个View类的对象并调用LoadRawData(),如下所示:

static void Main(string[] args) {
    kernel = new StandardKernel(new Modules()); //ninject
    formater = kernel.Get<IFormater>(); //ninject
    IView view = new View(formater);
    view.LoadRawData(args[0]);
}

我使用ninject作为DI机制,实际上现在一切正常。

问题:

  1. IView接口在内部调用Formater::LoadDtata()是否正确? (对我自己,我没有看到任何其他方式。)

  2. 我应该为Formater::LoadData()View::LoadRawData()设置不同的名称,或者它们应该具有相同的名称,或者可能有实践如何命名它们?

  3. 对不起看起来我做了几个严重不准确的事情。我已在上面纠正过它们。 其实我不使用MVC模式。我只这么认为。

    关键是我希望将显示逻辑与解析和格式化隔离开来。

    我的控制台应用程序应该打开一个文件,读取文本内容并将其传递给格式化程序类,它将进行一些格式化并将其恢复(但在此格式化程序将其传递给解析器以从原始文本中提取必要的内容),像这样 查看&lt; - &gt;形成器&lt; - &gt;解析器

    这是一个简单的编程,我用它来更好地理解一些最好的方法和实践,如TDD,单元测试和DI。

    我很抱歉以前的不一致。

1 个答案:

答案 0 :(得分:0)

要回答问题1),当您使用MVC模式时,您的具体视图(不是作为接口的IView)应该调用IController :: LoadData()。 Model,View,Controller之间的关系如下:

enter image description here

(图片取自this文章,其中给出了MVC的基本定义)

相反,控制器应将LoadData数据放入模型中,然后控制器应返回与该模型相关联(即可以访问)该模型的视图。

例如在ASP.NET MVC中,您可以执行以下操作:

public class YourController : Controller
{
 IDataRepository db;

 public YourController(IDataRepository db)
 {
  this.db = db; 
 }

 public ViewResult Index()
 {
  YourModel model = db.LoadData();
  return View(model);
 }
}

无法帮助您的是您尝试使用控制台应用程序中的MVC模式。我建议通过一个MVC教程(例如this非常好)来更好地理解。