我正在学习MVP,测试驱动方法和工厂模式。我想写几个简单的类来维护一个人的数据和存储库。该人的数据将存储在sql中并在xml中进行测试。我读到了关于StructureMap但不想使用它而是想要使用一个简单的工厂实现,最终可以帮助我在单元测试用例中挂钩。这是我的课程:
class Person
{
int id;
string name;
}
interface IPersonRepository
{
Person GetPerson(int id)
{
}
}
class PersonRepositorySql : IPersonRepository
{
Person GetPerson(int id)
{
//Fetch from sql
}
}
class PersonRepositoryXML : IPersonRepository
{
Person GetPerson(int id)
{
//Fetch from XML
}
}
static class PersonRepositoryFactory
{
static PersonRepositorySql Create()
{
return new PersonRepositorySql();
}
static PersonRepositoryXML CreateTest()
{
return new PersonRepositoryXML();
}
}
class Presenter
{
Presenter(View _view)
{
}
void DoSomething()
{
IPersonRepository fact = PersonRepositoryFactory.Create();
//fact.GetPerson(2);
}
}
class PresenterTest
{
void Test1()
{
IPersonRepository fact1 = PersonRepositoryFactory.CreateTest();
//fact1.GetPerson(2);
}
}
请告诉我,我采取的方法是正确的还是其他任何建议。此外,由于我没有在构造函数中传递对象,这不能作为依赖注入的示例吗?
答案 0 :(得分:1)
首先,不依赖于类,如果您希望代码可测试,则依赖于类实现的接口。
依赖于您的工厂的类应该期望用户注入。多亏了这一点,您可以轻松地在测试项目中交换存储库,而无需更改已测试的代码。
因此,您所拥有的任何工厂都应该更改为:
class PersonRepositoryXML: IPersonRepository
{
public IPerson GetPerson(int id)
{
//Fetch from XML
}
}
public interface IPersonRepository
{
IPerson GetPerson(int id);
}
// a dependent class
class SomeDependentClass {
public SomeDependentClass(IPersonRepository repository) {
this.repository = repository;
}
public void Foo() {
var person = repository.GetPerson(10);
// do smth to the person :)
}
}
我建议阅读this书,了解有关依赖注入设计模式的更多详细信息。