从哪个类调用DAL?

时间:2015-06-04 22:29:51

标签: c# class-design

public class Car
{
    public int ID { get; set;}
    public string Name { get; set; }

    // ?? Do I need these or is it better to have Car just contain properties?
    Add();
    Delete();
}

public static class CarDatabaseAccess
{
    public void AddCar(Car c);
    public void DeleteCar(Car c);
    public List<Car> RetrieveCars();
}

通过上面的对象设置,删除汽车的正确方法是什么?我基本上有两个选择

public void DeleteButton_Click(...)
{
    var car = listView.SelectedItem as Car;
    CarDatabaseAccess.DeleteCar(car);

    // or

    var car = listView.SelectedItem as Car;
    car.Delete();
}

数据库访问层调用存储过程,因此我无法切换到实体或类似的东西。

我应该注意到有100个对象需要一个DatabaseAccess类,因此在我拥有的时间范围内设置DatabaseAccess层的接口(用于依赖注入测试)是不可行的

3 个答案:

答案 0 :(得分:2)

这里基本上有一个存储库模式。将操作从Car中取出,并使用CarDatabaseAccess,它应该是一个接口,因此它是可测试的。

答案 1 :(得分:1)

我推荐第二种方法,因为你正在调用一个实例方法,这使得它可以测试。使用像FakeItEasy这样的库,您可以截取第二个Delete()方法并测试该方案。首先,您不能拦截或测试静态方法调用。

var car = listView.SelectedItem as Car;
car.Delete();

答案 2 :(得分:1)

你有点混合两种方法。第一个,当你在对象中直接包含Add / Delete / ...方法时,它被称为Active record pattern。第二个是当你创建一个单独的类来处理这些动作时,它们被称为Repository pattern。没有理由混合这两者,你真的不应该,至少不是这样。

选择你更喜欢哪一个,这并不重要。尽量保持一致。