我们有一个班级,比如 LegacyUserSettingsService 。 LegacyUserSettingsService 实现了一个接口 IUserSettingsService 。
您可以通过调用我们的ApplicationServicesFactory来获取 IUserSettingsService 的实例。工厂使用Spring.NET构建具体的 LegacyUserSettingsService 。
麻烦的是新开发人员有时会做自己的事情并直接构建 LegacyUserSettingsService 的新实例(而不是通过工厂)。
有没有办法保护具体类的构造函数,以便只能从工厂调用它?也许一个众所周知的模式?
请注意,具体类位于不同的程序集中(与Factory的程序集分开,因此 internal 关键字不是解决方案)。工厂程序集引用包含具体类的其他程序集。
有什么想法吗?
答案 0 :(得分:2)
相反,internal
将是一个很好的解决方案,关键是要使工厂组装成为另一个的“朋友组装”。有关详细信息,请参阅Friend Assemblies。
将LegacyUserSettingsService
设为internal class
,然后在包含该类的项目的assemblyinfo.cs
中添加行[assembly:InternalsVisibleTo("Spring.Core")]
。这应该允许Spring.NET访问该类型,但没有其他程序集。
答案 1 :(得分:1)
将LegacyUserSettingsService
构造函数标记为ObsoleteAttribute
且IsError
设置为true
。这纯粹是一个“编译时属性”,它会在使用构造函数的任何地方导致编译错误,但是可以通过Spring.NET的反射创建一个实例就好了。
答案 2 :(得分:0)
我们找到了一个可行的解决方案。由于我们的工厂使用Spring.NET,我们可以简单地将LegacyUserSettingsService的构造函数设为私有。 Spring仍然可以调用私有构造函数。
没有其他人能够(除非他们真的很努力并且采取反思路线)。
答案 3 :(得分:0)
您始终可以使用System.Reflection.ConstructorInfo或System.Linq.Expressions.Expression>调用私有构造函数。这将阻止临时开发人员直接创建实例。然后你的工厂对象就可以创建实例了,但那些讨厌的开发人员会被挫败!
答案 4 :(得分:-1)
我知道的唯一方法是将构造函数设为私有,并在类本身上具有静态工厂方法,可以从外部调用。
当然,这不符合您的问题要求。那么采用技术性较低的方法呢?沟通和代码审查?