Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.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/2/.net/24.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#_.net_Oop_Dependency Injection_Unity Container - Fatal编程技术网

C# 当我';我在使用依赖注入?

C# 当我';我在使用依赖注入?,c#,.net,oop,dependency-injection,unity-container,C#,.net,Oop,Dependency Injection,Unity Container,我有一个类,它封装了一组字符串,这些字符串用作用户未明确指定的应用程序设置的默认值 我目前正在使用一个普通的旧类,该类具有相关命名的实例方法,类似于: class SiteConfigurationConventions : ISiteConfigurationConventions { public String GetConfigurationFileName() { return "SiteConfiguration.xml"; } } 似乎静态

我有一个类,它封装了一组字符串,这些字符串用作用户未明确指定的应用程序设置的默认值

我目前正在使用一个普通的旧类,该类具有相关命名的实例方法,类似于:

class SiteConfigurationConventions : ISiteConfigurationConventions
{
    public String GetConfigurationFileName()
    {
        return "SiteConfiguration.xml"; 
    }
}
似乎
静态
类在概念上更合适(比如
System.Math
),因为这些字符串在运行时不会改变,也不需要字段,但我不确定静态类与DI的兼容性如何。例如,似乎不可能在容器中注册静态类,因此它会将静态类返回给构造函数,在容器解析的其他对象中请求静态类

现在,我注册了

container.RegisterType<ISiteConfiguration, SiteConfiguration>();
我的设计选项似乎是:

  • 重构到一个静态类,并直接在我的消费类中引用具体类型,而不是使用构造函数注入
  • 保持原样(类和实例解析为一个接口),为了正确起见,可能可以选择使用单例生存期注册它
  • 创造某种形式的门面或工厂来隐藏背后的静电。然而,出于某种原因,我觉得这种选择很愚蠢
像这样的类的“实例”的概念在概念上更为正确。我将它变成可实例化类的唯一原因是使它更加DI友好。这听起来是正确的还是正确的?我完全错过了什么吗


任何律师都将不胜感激。:)

大多数DI库都提供了指定单个实例可用于所有注入的选项(创建单个实例并每次给出答案)。这是一种单例的形式,可能很适合您的问题

例如,使用MS Unity library,您可以将:

container.RegisterInstance(new SiteConfiguration());

我认为“代码>静态< /代码>关键字是一种内置的单实例实现方式,而DI路径做的事情基本相同,但不使用编译器来处理细节。

< P> OK,经过一点研究、Google和思考,我相信我已经得出了自己的结论。 静态类的使用在某种意义上与IoC原则和松散耦合不符,我打算将其融入我的体系结构中。
static
修饰符是一种表示只有一个实现可以满足特定目的的方式,这通常与DI不一致(松耦合、接口编程、可测试性,以及所有与之相关的东西)

同样,静态修饰符实际上只是告诉编译器我们希望将类的实例数限制为一个,同时不允许将其分配给变量(即,不使用
new
运算符)。如果我们要使用IoC,我们应该将这样的生活方式管理留给合成根,而且无论如何,我们永远不会以这种方式直接引用具体的类(FCL类除外)。所以静态类对我们没有什么用处

因此,我建议将它作为一个普通的旧(非静态)类,并在构图根应用一种单身生活方式。当然,除非您认为您想要的静态类永远不可能改变,并且您永远不需要在测试中伪造它,在这种情况下,您可以将其视为一个稳定的依赖项(如FCL类),并将其从正常的DI方案中排除,直接在消费类中引用具体的类


如果您必须依赖于使用静态方法的第三方类或自身完全静态的第三方类,并且希望将其作为依赖项注入(从而能够替代测试等目的),您可能仍然应该创建一个接口,并依赖于调用静态方法以获取这些值的可实例化适配器。

但是您不能实例化静态类,因此您使用的语法(使用新运算符)肯定不起作用。对不起,我不清楚,我的意思是让类成为非静态的,并使用DI容器来处理它。啊,好的。你的帖子现在对我更有意义了对不起,我原来的误会。
container.RegisterInstance(new SiteConfiguration());