没有数据库的Winforms:使用相同有状态类的不同表单

时间:2014-10-10 00:46:30

标签: c# vb.net winforms design-patterns state

我正在开发一个小型实用程序Winforms应用程序。它只是转换加载到内存的文件。没有数据库。

有一个表示该文件的有状态类。它基本上是应用程序的数据源代替数据库。此类中的数据需要通过应用程序中的几种不同形式进行读取/修改。

我应该如何构建此应用程序以确保表单可以轻松地与该类进行通信。我的主表单可以简单地将对象传递给它的子表单,还是那种不好的做法?还有更好的选择吗?

由于

3 个答案:

答案 0 :(得分:2)

将应用程序状态对象的实例传递给子表单是可以接受的。

或者,您可以使用Singleton Pattern编写州级类,以便将其实例化一次(并且只执行一次)。

public class MyState
{
    // private constructor to stop others from instantiating the object
    private MyState()  { }

    private static MyState instance;

    public static MyState Instance
    {
        get 
        {
            if (instance == null)
            {
                instance = new MyState();
            }

            return instance;
        }
    }

    // Insert the class' methods/properties here as public, non-static
}

您还可以使用Dependency Injection库为子表单提供州级。我喜欢Autofac,但还有很多其他人。

最终,最佳做法是编写适合您应用程序需求的代码。

答案 1 :(得分:0)

最简单的方法就是在Static Accessor类上提供对整个应用程序的类的访问,如下所示:

public static class AppObjects
{
    private static MyClass _myClass;

    public static GetMyClass()
    {
        if(_myClass == null)
        {
            //Init/Load Object
        }
        return _myClass
    }
}

也就是说,让父表单将对象传递给它的子表单并不可怕。如果您希望更改相关内容(如UI结构或所需对象数),则只需使用更复杂的解决方案。

答案 2 :(得分:0)

您可以创建一个简单的实例存储库。这样做的逻辑是您可以从集合中检索安装,还应该提供添加实例的添加方法。

样本将是

        private List<object> _instanceRepo;

    public TInstance Retrieve<TInstance>()
    {
        TInstance response = default(TInstance);
        object retrieved = _instanceRepo.FirstOrDefault(x => x.GetType() == typeof(TInstance));
        if (retrieved == null)
            Console.WriteLine("retrieved object was null.");
        else
            response = (TInstance)retrieved;

        return response;
    }

或创建单例,这是通过创建暴露单个实例的类的静态属性来实现的。

在此处阅读工厂:Factory 在这里阅读单身:Singleton