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…”,那么每次获得实例时,我不必传入这些值吗?