题
我有一个类,其信息的存储将取决于它是否被 Web 应用程序或 Windows 应用程序使用。我打算使用工厂模式来传递正确的对象。我想如果我不想重新创建该对象,调用者会适当地存储该对象。有人对基于平台抽象数据存储有其他建议吗?
例如,我想在由 Windows 应用程序调用时将数据存储为局部变量(发送适当的子类),并在由 Web 应用程序调用时保存在 Session 中。
解决方案
作为sgreeve说,关注点分离是值得考虑到为了得到维护的代码。
使用存储库的想法,在winform应用程序和Web应用程序可以注入他们自己的存储供应商。如果需要的话通过继承或组合物的那些供应商可以共享一些共同的逻辑。
public class MyClassRepository
{
IStorageProvider _provider;
public MyClassRepository(IStorageProvider provider)
{
_provider = provider;
}
public void Save(MyClass o)
{
_provider.Save(o);
}
public MyClass GetBy(string id)
{
return _provider.GetBy(id);
}
}
在Winforms应用程序将通过调用存储:
var provider = new WindowsStorageProvider();
var rep = new MyClassRepository(provider);
rep.Save(myClassObject);
和Web应用程序:
var provider = new WebStorageProvider();
var rep = new MyClassRepository(provider);
rep.Save(myClassObject);
其他提示
在我看来,工厂模式并不是解决您所遇到的问题的方法。工厂模式旨在提供类的特定子类型的实例,使工厂的调用者免受 (a) 返回的实际子类型和 (b) 工厂用于决定返回哪个子类型的逻辑的影响。
这不是你在这里需要的。我认为您需要将数据的存储从对所存储的数据进行建模的类中抽象出来。
您有一个两个应用程序共有的类,并且每个应用程序都应该实现以适合该应用程序的方式存储类封装的数据的功能。这意味着两件事:
每个应用程序(Web 和 Windows 窗体)都应该包含存储数据的功能 - 但两者都不需要包含对方使用的代码。例如Windows 窗体应用程序不需要知道如何在 Web 会话中存储数据。因此,在 Web 会话中存储数据的代码应该位于属于 Web 应用程序但不属于 Windows Forms 应用程序的对象中,反之亦然。
鉴于这种情况,并且考虑到您要存储的数据的类必须对两个应用程序都是通用的,因此该存储逻辑不能是该类的一部分。(遵循公认的 OO 设计原则,该类无论如何都不应该知道如何将自己存储在应用程序的不同部分中,因为这会引入依赖关系,从而使将来的更改变得困难。请参阅 单一责任原则...)
希望这有帮助