Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 单例的可能有效使用?_C#_Design Patterns_<img Src="//i.stack.imgur.com/WM7S8.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">servicestack - Fatal编程技术网 servicestack,C#,Design Patterns,servicestack" /> servicestack,C#,Design Patterns,servicestack" />

C# 单例的可能有效使用?

C# 单例的可能有效使用?,c#,design-patterns,servicestack,C#,Design Patterns,servicestack,在我的设计中,我已经到了一定程度,我正在认真考虑单身 众所周知,“常见”的论点是“永远不要这样做!太可怕了!”,就好像我们在代码中乱放了一堆语句 这是一个极好的框架。我和我的团队都被它说服了,我们需要实现一个复杂的基于web服务的基础设施。我一直鼓励采用异步设计,并尽可能在服务堆栈客户端上使用sendascync 考虑到我们所有这些不同的系统都在做不同的事情,我想到我想要一个通用的记录器(实际上是一个web服务本身,如果web服务不可用,则返回到本地文本文件-例如,一些恶魔正在跟踪大楼)。虽然我

在我的设计中,我已经到了一定程度,我正在认真考虑单身

众所周知,“常见”的论点是“永远不要这样做!太可怕了!”,就好像我们在代码中乱放了一堆语句

这是一个极好的框架。我和我的团队都被它说服了,我们需要实现一个复杂的基于web服务的基础设施。我一直鼓励采用异步设计,并尽可能在服务堆栈客户端上使用
sendascync

考虑到我们所有这些不同的系统都在做不同的事情,我想到我想要一个通用的记录器(实际上是一个web服务本身,如果web服务不可用,则返回到本地文本文件-例如,一些恶魔正在跟踪大楼)。虽然我非常喜欢依赖注入,但向每个异步请求传递对“使用此记录器客户端”的引用似乎并不干净(至少对我来说是这样)

鉴于ServiceStack的失败签名是一个
Func
(我对此没有任何错误),我甚至不确定首先进行调用的封闭方法是否具有有效句柄

然而,如果我们在这一点上有一个单例记录器,那么我们在世界的哪个地方,我们在哪个线程上,以及我们在无数匿名函数中的哪个部分都无关紧要


这是一个可接受的有效案例,还是一个不带参数的单例实例?

如果您将公共日志放在应用程序代码调用的静态外观后面,请扪心自问,您将如何实际对代码进行单元测试。这是依赖项注入试图解决的问题,但您正在通过让应用程序逻辑依赖于静态类来重新引入它

你可能还有另外两个问题。我要问你的问题是:你确定你没有记录太多日志,你确定你没有违反坚实的原则吗


我写了一封信。我建议你读一读。

和往常一样,我更喜欢有一个工厂。这样,我可以在将来更改实现并维护客户合同

你可以说singleton的实现也可能会改变,但工厂只是更普遍而已。例如,工厂可以实施任意的生存期策略,并随时间或根据您的需要更改此策略。另一方面,虽然这在技术上可以为一个单例实现不同的生命周期策略,但是您得到的可能不应该被视为“单例”,而是“具有特定生命周期策略的单例”。这可能和听起来一样糟糕


每当我使用一个单体,我首先考虑一个工厂,大多数时候,工厂只是胜过单身。如果你真的不喜欢工厂,那就创建一个静态类——一个只有静态方法的无状态类。很可能,您不需要对象,只需要一组方法。

单例的经典实现只有一个问题- 易于访问,可直接使用,从而产生强耦合, 神的物体等

在经典实现下,我的意思是:

class Singleton
{
   public static readonly Singleton Instance = new Singleton();
   private Singleton(){}
   public void Foo(){}
   public void Bar(){}
}
如果仅在对象生命周期策略方面使用singleton, 让IoC框架为您管理,保持松散耦合- 拥有一个类的“一个”实例没有什么错
在应用程序的整个生命周期中,只要您确保它是线程安全的。

日志记录是作为一个单例应用程序有意义的领域之一,它永远不会对您的代码产生任何副作用,并且您几乎总是希望全局使用同一个日志记录程序。在使用单例时,您应该关注的首要问题是线程安全性,对于大多数记录器来说,默认情况下它们是线程安全的

允许您通过在App_上全局配置来提供可替代的日志记录实现,从以下开始:

LogManager.LogFactory = new Log4NetFactory(configureLog4Net:true);
在此之后,每个类现在都可以访问上面工厂中定义的Log4Net记录器:

class Any
{
    static ILog log = LogManager.GetLogger(typeof(Any));
}
在所有测试项目中,我喜欢将所有内容都记录到控制台,因此我只需要使用以下命令设置一次:

LogManager.LogFactory = new ConsoleLogFactory();

默认情况下,ServiceStack.Logging会将日志记录到一个良性的NullLogger,它会忽略每个日志条目。

“众所周知,“common”参数是“Never do it!”!太可怕了!“常见于何处?我几乎从不使用静态类,我也避免使用singleton,但我不认为它们很糟糕,我也不希望我的代码依赖于它们。@Filip,你不必在Google或StackOverflow上进行太多搜索就能找到“反singleton之怒”队伍。虽然有一些人相信它在某些利基场景中总会有一席之地,但也有一些人会否决以单身为例的答案。因此,为了最佳实践的利益,我认为最好提出这个问题。这就是这个网站的目的:)只是单身的不必要。如果很好地使用依赖项注入,您甚至无法创建一个只应该存在一次的对象。它是DI容器提供给您的,容器独自管理它的生命周期,确保它只被创建一次。@我觉得讽刺的是,除非您有办法传递容器,否则容器本身通常是一个单例(StructureMap.ObjectFactory有人吗?)。谢谢您的回答,Steven。现有的基础设施确实记录了太多的日志,但这并不是我真正关心的问题,而是“向前迈进”的基础设施。我非常喜欢在必要时记录日志。在我们的业务中有许多内部和第三方系统,虽然我的前任可能对“日志”部门过于热心(显然有不同的实现……wtf?),但我希望有一个更干净的“需要时日志”策略。在撰写本文时,我的想法就在这里。它将有一个单一的方法<代码>日志(日志条目)。剩下的更多的是一种思维方式