是否有一种模式允许仅从特定工厂和其他地方调用构造函数?

时间:2010-03-17 07:24:35

标签: .net design-patterns

我们有一个班级,比如 LegacyUserSettingsService LegacyUserSettingsService 实现了一个接口 IUserSettingsService

您可以通过调用我们的ApplicationServicesFactory来获取 IUserSettingsService 的实例。工厂使用Spring.NET构建具体的 LegacyUserSettingsService

麻烦的是新开发人员有时会做自己的事情并直接构建 LegacyUserSettingsService 的新实例(而不是通过工厂)。

有没有办法保护具体类的构造函数,以便只能从工厂调用它?也许一个众所周知的模式?

请注意,具体类位于不同的程序集中(与Factory的程序集分开,因此 internal 关键字不是解决方案)。工厂程序集引用包含具体类的其他程序集。

有什么想法吗?

5 个答案:

答案 0 :(得分:2)

相反,internal将是一个很好的解决方案,关键是要使工厂组装成为另一个的“朋友组装”。有关详细信息,请参阅Friend Assemblies

LegacyUserSettingsService设为internal class,然后在包含该类的项目的assemblyinfo.cs中添加行[assembly:InternalsVisibleTo("Spring.Core")]。这应该允许Spring.NET访问该类型,但没有其他程序集。

答案 1 :(得分:1)

LegacyUserSettingsService构造函数标记为ObsoleteAttributeIsError设置为true。这纯粹是一个“编译时属性”,它会在使用构造函数的任何地方导致编译错误,但是可以通过Spring.NET的反射创建一个实例就好了。

答案 2 :(得分:0)

我们找到了一个可行的解决方案。由于我们的工厂使用Spring.NET,我们可以简单地将LegacyUserSettingsService的构造函数设为私有。 Spring仍然可以调用私有构造函数。

没有其他人能够(除非他们真的很努力并且采取反思路线)。

答案 3 :(得分:0)

您始终可以使用System.Reflection.ConstructorInfo或System.Linq.Expressions.Expression>调用私有构造函数。这将阻止临时开发人员直接创建实例。然后你的工厂对象就可以创建实例了,但那些讨厌的开发人员会被挫败!

答案 4 :(得分:-1)

我知道的唯一方法是将构造函数设为私有,并在类本身上具有静态工厂方法,可以从外部调用。

当然,这不符合您的问题要求。那么采用技术性较低的方法呢?沟通和代码审查