C# 在静态类中存储全局不可变数据
我有一个WinForms项目,它使用了很多用户控件。其中一些用户控件使用来自业务逻辑层的类。这些类主要执行对数据库的CRUD操作(通过数据访问层)以及一些额外的验证和报告 该项目使用一些公共对象(登录用户、一些控制器和验证器),这些对象以主窗体实例化,然后通过初始化方法或公共属性注入子用户控件。这意味着,我有很多代码,它们只是将这些公共对象从父控件传递到子控件 为了避免这种情况,我可以创建一个静态类(例如ApplicationContext)并将所有常用控件保存到其中。这将在主窗体中发生,项目中的所有其他用户控件或窗体都可以使用它 我发现通常不鼓励使用这种模式(在静态类中存储一些全局数据)。但如果这些数据是不可变的呢?这是一个好主意吗 或者你知道有什么其他方法可以帮我去掉所有的初始化代码吗?你可以使用像或这样的容器,让它自动为你连接对象图 您可以让每个需要任何一个公共对象的对象通过构造函数参数或作为公共属性定义对其接口的依赖关系,IoC容器将相应的对象连接在一起 Unity的属性注入示例:C# 在静态类中存储全局不可变数据,c#,.net,static,global,application-design,C#,.net,Static,Global,Application Design,我有一个WinForms项目,它使用了很多用户控件。其中一些用户控件使用来自业务逻辑层的类。这些类主要执行对数据库的CRUD操作(通过数据访问层)以及一些额外的验证和报告 该项目使用一些公共对象(登录用户、一些控制器和验证器),这些对象以主窗体实例化,然后通过初始化方法或公共属性注入子用户控件。这意味着,我有很多代码,它们只是将这些公共对象从父控件传递到子控件 为了避免这种情况,我可以创建一个静态类(例如ApplicationContext)并将所有常用控件保存到其中。这将在主窗体中发生,项目中
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容器了解的公共对象,然后请求根对象。对象图将为您神奇地组合起来,您不必使用所有连接代码,也不必关心它是如何完成的。您可以使用类似或的容器,让它自动为您连接对象图
您可以让每个需要任何一个公共对象的对象通过构造函数参数或作为公共属性定义对其接口的依赖关系,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容器了解的公共对象,然后请求根对象。对象图将为您神奇地组合起来,您不必使用所有连接代码,也不必关心它是如何完成的。您可以使用静态类来存储一些不可变的数据-这没有问题。 然而,如果您想在那里存储控件,它可能无法按预期工作。
例如OnDataBinding和Render之类的方法。您可以使用静态类来存储一些不可变的数据—这没有问题。 然而,如果您想在那里存储控件,它可能无法按预期工作。
例如,OnDataBinding和Render等方法。您可以使用依赖项注入/ioc容器来维护全局对象。 我在这方面有很好的经验,但还有很多其他的。
使用setter注入时,所有控件都会自动设置依赖对象。您可以使用依赖注入/ioc容器来维护全局对象。 我在这方面有很好的经验,但还有很多其他的。
使用setter注入时,所有控件都会自动设置set依赖对象。在这种情况下,您需要使用单例。单例将允许您使用对象的同一实例,比静态实例更安全、更灵活
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();
}
}
在这种情况下,您需要使用单例。单例将允许您使用对象的同一实例,比静态实例更安全、更灵活
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();
}
}
当单身汉不是一成不变的时候,他们是不好的。可以随时更改的全局状态是很难解决的bug的来源。如果他更改对象而不仅仅是访问对象,你是对的。然而,我知道他主要是在设置它们,为了避免传递这些未更改的实例,他可以使用单例。单例如果不是不可变的,则是不好的。可以随时更改的全局状态是很难解决的bug的来源。如果他更改对象而不仅仅是访问对象,你是对的。不过,我知道他主要是在设置它们,为了避免传递这些未更改的实例,他可以使用Singleton.IoC容器,谢谢。我选择了ninject:)IoC容器是我想要的,谢谢。我选择了ninject:)