Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.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_Singleton - Fatal编程技术网

C# 带有参数的辅助对象的单个实例

C# 带有参数的辅助对象的单个实例,c#,design-patterns,singleton,C#,Design Patterns,Singleton,我们的一个项目使用键值对,其中某些运行时参数(不会因程序的每个实例而改变)确定获得的值。例如: 程序在测试模式下运行,参数为“市政”: Key: "testMunicipalDirectory" Value: "C:\Foo\Bar\" Key: "StateDirectory" Value: "C:\Bar\Baz\" 程序运行时使用参数“State”: Key: "testMunicipalDirectory" Value: "C:\Foo\Bar\" Key: "StateDirec

我们的一个项目使用键值对,其中某些运行时参数(不会因程序的每个实例而改变)确定获得的值。例如:

程序在
测试
模式下运行,参数为
“市政”

Key: "testMunicipalDirectory"
Value: "C:\Foo\Bar\"
Key: "StateDirectory"
Value: "C:\Bar\Baz\"
程序运行时使用参数
“State”

Key: "testMunicipalDirectory"
Value: "C:\Foo\Bar\"
Key: "StateDirectory"
Value: "C:\Bar\Baz\"
更复杂的是,如果没有匹配的键,比如说
“testMunicipalImagesDirectory”
,则会出现
“defaultImagesDirectory”

目前,存在大量的代码重复/效率低下,并且存在出错的空间。每次引用其中一个时,都会出现字符串连接、空合并和其他一些情况

这似乎得益于在初始化时传递特定参数的单个实例对象(
test
或not、
“State”
“civility”
等),该对象将为键所代表的每个不同属性返回正确的值

对于如何使用带有参数的singleton设计模式的问题,我发现许多答案基本上归结为“如果它使用参数,您可能不想要singleton”。在我的例子中,尝试用不同的值初始化对象是无效的,如果发生这种情况,应该抛出异常

这就是我实现这一目标的方法(pseudo-C#)(延迟加载不是一个要求,但在这里使用):

公共密封类帮助器
{
//我们如何强制执行已调用的Init?
private static readonly Lazy Lazy loader=new Lazy(()=>new Helper(name,test));
公共静态助手实例{get{return lazyLoader.Value;}}
公共静态void Init(字符串名,bool测试)
{
//如果它已经被初始化了
抛出新的InvalidOperationException(“此已初始化”);
//否则就初始化它
}
私有字符串名称{get;set;}
私有布尔测试{get;set;}
私有助手(字符串名,bool测试){}//分配给属性,任何其他ctor逻辑
公共字符串目录
{get{return ValueGetter.get((this.Test?:“)+this.Name+“Directory”);}
}
公共静态类ValueGetter
{
公共静态字符串Get(字符串键、字符串回退键)
{
if(key.Any(k=>k==key))
返回键[key].值;
其他的
返回键[fallbackKey]。值;
}
}
但正如你所看到的,还有一些问题。它如何在使用
实例
之前强制调用
Init
,而不要求每次访问
实例
时都传递这些参数


这是正确的方向,还是有更好的设计模式可供使用?

也许依赖项注入可以帮助您做到这一点?我对依赖项注入了解不多。您能举一个简单的例子说明如何以这种方式使用它吗?DI只是将任何必需的数据注入到您的对象中。初始化的任何数据都应该在创建对象之前初始化,然后注入/传递到对象中(可能通过构造函数)。如果初始化失败,则不应创建对象,从而防止在初始化之前使用对象的问题。不要使
Init
static,而是在“gettinf”实例时延迟调用它。这基本上就是我正在做/需要做的事情。
Helper
类使用的值被传递到该类中,而不是在其内部确定。如果使用“have lazy call to it…”,那么每次获得实例时,我不必传入这些值吗?