在静态类中存储全局不可变数据

时间:2011-09-22 07:38:06

标签: c# .net static global application-design

我有一个WinForms项目,它使用了很多用户控件。其中一些用户控件使用业务逻辑层中的类。这些类主要是对数据库执行CRUD操作(通过数据访问层)以及一些额外的验证和报告。

该项目使用一些常见对象(已记录的用户,一些控制器和验证器),这些对象以主窗体形式实例化,然后通过初始化方法或公共属性注入子用户控件。这意味着,我有很多代码,只是将这些常见对象从父控件传递给子控件。

为了避免这种情况,我可以创建一个静态类(例如ApplicationContext)并将所有常用控件保存到其中。这将在主窗体中发生,项目中的所有其他用户控件或窗体都可以使用它。

我发现一般不鼓励这种模式(在静态类中存储一些全局数据)。但是,如果这些数据是不可变的呢?这种做法是不是一个好主意?

或者您是否知道其他任何可以帮助我摆脱所有初始化代码的方法?

4 个答案:

答案 0 :(得分:2)

您可以使用Inversion of ControlUnity之类的Autofac容器,并让它自动连接您的对象图。

您可以让每个需要任何一个公共对象的对象通过构造函数参数或公共属性定义对其接口的依赖关系,并且IoC容器将相应的对象连接在一起。

使用Unity的属性注入示例:

public class MyUserControl : UserControl 
{
    [Dependency]
    public LoggedUserService UserService { get; set; }

    public void Method()
    {
        // the IoC container will ensure that the UserService
        // property has been set to an object
    }
}

您在主窗体中所做的只是注册您希望IoC容器知道的公共对象,然后您要求提供根对象。对象图将为您神奇地组装,您不必知道所有线代码,也不关心它是如何完成的。

答案 1 :(得分:1)

您可以使用依赖注入/ ioc容器来维护全局对象。 我对autofac library有很好的经验,但还有很多其他的可用。 使用setter注入时,所有控件都会自动设置依赖对象集。

答案 2 :(得分:1)

你会想要在这种情况下使用Singletons。单身人士将允许您使用对象的相同实例,比静态更安全和灵活。

public sealed class Singleton
{
    public object Property1 {get;set;}
    public void Method1 (){}

    static Singleton instance = null;
    static readonly object padlock = new object();

    Singleton()
    {
    }

    public static Singleton Instance
    {
        get
        {
            lock (padlock)
            {
                if (instance==null)
                {
                    instance = new Singleton();
                }
                return instance;
            }
        }
    }        
}

然后你可以像静止一样使用它,但有点不同......

public class Main
{
     public Main()
     {
         Singleton.Instance.Property1 = "somevalue";
         Singleton.Instance.Method1();
     }

}

答案 3 :(得分:0)

您可以使用静态类来存储一些不可变数据 - 这没有问题。 如果你想在那里存储控件,它可能无法按预期工作。 例如OnDataBinding和Render等方法。