2011-09-22 43 views
1

我有一个WinForms项目,它使用了大量的用户控件。其中一些用户控件使用来自业务逻辑层的类。这些类主要对数据库执行CRUD操作(通过数据访问层)以及一些额外的验证和报告。在静态类中存储全局不可变数据

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

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

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

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

回答

2

您可以使用Inversion of Control容器,如UnityAutofac,并让它自动连接您的对象图。

您可以让每个需要任何一个公共对象的对象通过构造函数参数或公共属性定义对其接口的依赖关系,并且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

IoC容器就是我一直在寻找,谢谢。我选择了ninject :) – sventevit

0

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

1

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

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(); 
    } 

} 
+0

当他们不是不可变的时候,单身是不好的。随时可以更改的全局状态是一个很难解决的错误来源。 –

+0

你是对的,如果他改变的对象,而不是只访问它们。但是,我明白他是在Main中设置它们的,并且为了避免传递这些不变的情况,他可以使用Singletons。 – bencobb

相关问题