当客户端应用程序请求新对象时, 我让Factory类为我创建了这个新对象。
public class CarFactory{
public Car CreateCar()
{
//create a new car object and send back
}
}
通过调用存储在数据库中的存储过程来填充car对象的属性。在数据库中,我们存储可以每天更改的默认值。默认表由外部系统填充。
public class Car {
public List<string> DefaultTyres {get;set;}
public List<string> DefaultPetrolSpec {get;set;}
}
因此,当工厂(服务层调用)创建Car对象时,工厂类调用存储库类,然后调用DB来填充Car的属性......但这些层的关系听起来有点奇怪。
public Car CreateCar()
{
//create a new car object and send back
//Call CarRepository.GetDefaultTyres(), CarRepository.GetDefaultPetrolSpec() etc.
}
因为我认为我的工厂实施工作做得很多。也许它不应该调用存储库层(然后调用数据库来获取汽车对象的数据)。
你们觉得怎么样?工厂类应该与DB通信吗?他们这样做好吗?如果没有,那么它的责任应该是什么?
答案 0 :(得分:0)
如果你有一个额外的类来处理实际的数据库连接,我认为这很好。这个类的意思是执行实际连接,处理一些连接/查询异常等.Cool类不应该知道与DB相关的东西,它应该委托到另一个类/对象
这个DB的抽象层也可以是一个完整的层次结构树,而不仅仅是一个类。像这样:
每个子类都知道如何处理与特定RDBMS的连接。
PS:请注意,这只是一个例子,您可能不必像这样做。此外,拥有这样的层次结构可能会使事情变得复杂,因为您可能也需要这些类的工厂。
答案 1 :(得分:0)
答案取决于是否可能存在多个(实施)存储库或多个数据库/其他数据存储。如果上面的答案是肯定的(即使这只是预期的需求/可能性),最好有一个存储库层,以便在/如果发生这些变化时将Factory类与上述变化隔离开来。 / p>
以不同的方式思考: 是工厂阶级知道如何制造汽车的责任; 不有责任知道连接到/何时/如何连接数据库。通常,kepp职责更容易促进变革和模块化设计
答案 2 :(得分:0)
随着时间的推移,我学到的一件事就是你的问题可能有5个答案。并且,所有这些都是正确的。真正的问题是:你在做什么才有意义?如果您的工厂位于服务器上并且与数据库的连接最接近,那么这就是调用的位置。
现在我有时会问自己同样的问题以及其他问题。例如,工厂应该在制造汽车时为汽车制造轮胎和汽油,还是汽车应该是知道如何创造自己的汽车。
所以你可能想要考虑这个问题:如果你的工厂正在创建大量的对象(这通常是你有工厂模式的原因),那么你的所有元素都有一个基类可能是有道理的暴露Create方法的接口。 (我发布了一个非常快速和肮脏的例子,做反射创建类型可以使工厂更加通用)
示例:
public interface FactoryObject
{
void Create();
void Destroy();
}
public class Car:FactoryObject
{
public void Create()
{
//TODO: Create my tyres and my petrol
//TODO: Create my fenders and body
}
}
public class Bicycle:FactoryObject
{
public void Create()
{
//TODO: Create my tyres but I do not need petrol
//TODO: Create my fenders but I have no body
}
}
public class Factory
{
public FactoryObject GetFactoryObject(Type type)
{
FactoryObject returnedObject = null;
if ( type is Car ) returnedObject = new Car();
elseif (type is Bicycle) returnedObject = new Bicycle();
if (returnedObject != null)
returnedObject.Create();
return returnedObject;
}
}
以这种方式,您的工厂知道要创建一个FactoryObject,但是它不知道如何构建该对象。更重要的是,它并不关心。