0

我有一个类,其信息的存储将取决于它是否被 Web 或 Windows 应用程序使用。我打算使用工厂模式来传递正确的对象。如果我不想重新创建对象,我猜调用者会适当地存储该对象。有人对基于平台抽象出数据存储有其他建议吗?

例如,我想在 Windows 应用程序调用时将数据存储为局部变量(发送适当的子类),并在 Web 应用程序调用时保存在 Session 中。

4

2 回答 2

1

正如 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);

和网络应用程序:

var provider = new WebStorageProvider();
var rep = new MyClassRepository(provider);
rep.Save(myClassObject);
于 2009-03-13T21:54:15.983 回答
0

在我看来,工厂模式似乎不是解决您遇到的问题的方法。工厂模式旨在提供类的特定子类型的实例,保护工厂的调用者免受(a)返回的实际子类型和(b)工厂用来决定返回哪个子类型的逻辑。

这不是你在这里需要的。我认为您需要将数据的存储从对存储的数据建模的类中抽象出来。

您有两个应用程序共有的类,每个应用程序都应实现以适合该应用程序的方式存储由您的类封装的数据的功能。这意味着两件事:

  1. 每个应用程序(Web 和 Windows 窗体)都应该包含存储数据的功能 - 但两者都不需要包含对方使用的代码。例如,Windows 窗体应用程序不需要知道如何在 Web 会话中存储数据。因此,在 Web 会话中存储数据的代码应该在一个对象中,该对象是 Web 应用程序的一部分,而不是 Windows 窗体应用程序的一部分,反之亦然。

  2. 鉴于这种情况,并且您要存储的数据的类必须对两个应用程序都是通用的,因此该存储逻辑不能是该类的一部分。(遵循公认的 OO 设计原则,该类不应该知道如何将自己存储在应用程序的不同部分中,因为这会引入使未来更改变得困难的依赖关系。请参阅单一责任原则......)

希望这会有所帮助

于 2009-03-13T21:22:14.203 回答