我一直注意到静态类在用于存储全局信息方面在SO上获得了很多不好的代表.(而且全局变量一般都被嘲笑)我只想知道下面的例子有什么好的选择......
我正在开发一个WPF应用程序,并且根据当前登录用户的ID过滤了从我的数据库中检索到的数据的许多视图.同样,我的应用中的某些点应该只能被视为"管理员"的用户访问.
我目前正在静态类中存储loggedInUserId和isAdmin bool.
我的应用程序的各个部分需要这些信息,我想知道为什么它在这种情况下不理想,以及替代品是什么.起床和跑步似乎非常方便.
我唯一可以想到的替代方法是使用IoC容器将Singleton实例注入需要此全局信息的类中,然后类可以通过其接口与之通信.然而,这是否过度/导致我陷入分析瘫痪?
提前感谢您的任何见解.
更新
因此,我倾向于通过IoC进行依赖注入,因为它可以更好地提供可测试性,因为我可以交换一个服务,如果需要,可以使用模拟提供"全局"信息.我想剩下的是注入的对象是单身还是静态.:-)
如果等待查看是否还有其他讨论,请问问Mark的答案.我不认为这是正确的方式.我只是想看到一些可以启发我的讨论,因为在没有任何建设性的替代方案的情况下,似乎有很多"这是坏的""很糟糕"的陈述在一些类似的问题上.
更新#2 所以我选择了Robert的答案,因为它是一个很好的选择(我认为替代方案是一个奇怪的词,可能是One True Way,因为它是内置于框架中).它并没有强迫我创建一个静态类/单例(尽管它是线程静态的).
唯一让我感到好奇的是,如果我必须存储的"全局"数据与用户身份验证无关,那将如何处理.
我有一些课程,我被要求添加一些单元测试与Rhino Mocks并有一些问题.
首先,我知道RhinoMocks不允许模拟静态成员.我正在寻找我的选择(除了使用TypeMock).
我所拥有的类的示例与以下类似:
class Example1 : ISomeInterface
{
private static ISomeInterface _instance;
private Example1()
{
// set properties via private static methods
}
static Example1()
{
_instance = new Example1();
}
public static ISomeInterface Instance()
{
get { return _instance; }
}
// Instance properties
// Other Instance Properties that represent objects that follow a similar pattern.
}
Run Code Online (Sandbox Code Playgroud)
所以当我打电话给上面的课时,它看起来像这样......
Example1.Instance.SomeObject.GoDownARabbitHole();
Run Code Online (Sandbox Code Playgroud)
有没有办法让我SomeObject.GoDownARabbitHole()在这种情况下嘲笑或嘲笑实例?
我习惯脚本语言.PHP,Javascript等,我写了一些相对简单的Java和C#应用程序.这是一个我一再需要答案的问题,我想我不是唯一一个.
假设我使用的是Javascript.
我有一个由GUI调用的函数A(),它检索一些值.
函数B(),也由GUI调用,需要该值,但函数B()将被调用任意次数,即A()之后的任意长度.
我不希望A()每次重新计算值.
一个示例是登录凭据.A()要求输入用户名,B()使用该值在每次调用时追加到日志中.
为此我可能只使用一个全局变量.
现在,C#.没有全局变量!我该怎么做?
编辑: 享受答案,但有很多"尽量不使用全局"的评论.我明白了,但我想听听这个要求的替代模式.
在阅读本文以及一些示例后,我仍然不清楚全局变量的含义.那么它说你班上的私有变量是全局变量?
http://www.c2.com/cgi/wiki?GlobalVariablesAreBad
所以有人可以用简单的语言向我解释这个背景.这是否意味着甚至是班级顶层的私人领域?我不清楚"全局变量"的定义,以便我可以区分我是否在我的课程中做了"坏"的事情.
这个单例实现是否正确且是线程安全的?
class Class
{
public static readonly Class Instance;
static Class()
{
Instance = new Class();
}
private Class() {}
}
Run Code Online (Sandbox Code Playgroud) 我找不到与此问题有关的任何信息.我正在尝试在C#中创建一个全局数组,以便我可以在代码中的不同位置输入信息,然后稍后再调用该信息来显示它.例如,我想获取以下信息并将其放入数组中:
string auctionID;
string itemName;
string itemID;
string bid;
string buyout;
string quantity;
Run Code Online (Sandbox Code Playgroud)
然后我希望能够使用for循环或类似的东西调用该数组,以便我可以在以后显示该信息.现在,我忘了提到的一件小事是,我可能需要一个数组数组或一个多维数组.这是因为我将有很多不同的拍卖和每次拍卖的数据(因此上面的变量),我想在程序的最后显示这些信息.感谢您的时间!
更新1
所以,我认为我并没有说清楚,因为我感到困惑,但这也可能是因为我对这个程序感到有些沮丧.我希望能够创建一个全局数组,然后在程序中使用不同的函数获取和设置存储在该数组中的信息,因为不同的函数将修改该数组的不同部分.另外,我不介意使用缓存,如果我理解它是如何工作的,甚至有一个链接来阅读它.最后一件事是,我在Windows Phone 7上这样做,所以我可以使用哪些库和系统调用.
更新2
我在OOP上有点生疏,所以我将更多地阅读它(感谢处理大量HTML并且没有机会进行真正的编程).谢谢大家的建议.如果我不能弄清楚什么,我可能会回复这个话题.干杯!