Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/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#_Constructor - Fatal编程技术网

为什么没有办法约束构造函数';C#的签名?

为什么没有办法约束构造函数';C#的签名?,c#,constructor,C#,Constructor,这个问题看起来很奇怪,但我们确实有需要修复构造函数签名的情况 例如,我希望它用于在DI中解析依赖项。如果构造函数被扩展并需要更多的参数,其中一些参数与上下文相关,我就有麻烦了。 当然,如果DI容器不能解决依赖关系,它会抛出异常,但我认为这不是最好的方法 我只是重构了我们的应用程序,并了解到最初计划好的DI候选者现在由于故意的构造函数扩展而被破坏了,而不了解其后果。阻止它的唯一方法就是开发者之间的约定。 语言支持将非常有用,但C#和Java都没有 所以我认为这项功能没有实现是有原因的…为什么 我们

这个问题看起来很奇怪,但我们确实有需要修复构造函数签名的情况

例如,我希望它用于在DI中解析依赖项。如果构造函数被扩展并需要更多的参数,其中一些参数与上下文相关,我就有麻烦了。
当然,如果DI容器不能解决依赖关系,它会抛出异常,但我认为这不是最好的方法

我只是重构了我们的应用程序,并了解到最初计划好的DI候选者现在由于故意的构造函数扩展而被破坏了,而不了解其后果。阻止它的唯一方法就是开发者之间的约定。
语言支持将非常有用,但C#和Java都没有

所以我认为这项功能没有实现是有原因的…为什么

我们的工厂是这样的:

public class EntityBase : IEntity
{
   public EntityBase(IBusinessModel model, IAppContext context)
   {
   }
}

public class DescendatnEntity : EntityBase, IDescendatnEntity
{
   public DescendatnEntity(IBusinessModel model, IAppContext context, ...additional params...)
   {
   }
}

public interface IEntitiesFactory
{
     IEntity GetBaseEntity();
     IDescendantEntity GetDescendantEntity(...those additional params...); 
}
IBusinessModel
IAppContext
单例,而附加参数是暂时的


如果只有调用者知道瞬态参数的值,工厂就不需要知道这些参数。

您可以使用构造函数链接来提供默认实现

public class DescendantEntity : EntityBase, IDescendatnEntity
{

   public DescendantEntity(IBusinessModel model, IAppContext context, ...additional params...)
   {
   }
   public DescendantEntity(IBusinessModel model, IAppContext context)
       this(model, context, ...additional params defaults...)
   {
   }
}

修复构造函数签名是什么意思?如果你让构造函数正常运行,这些类最终会从哪里获得依赖关系?听起来你只需要创建一个工厂类,可以用来创建类型。@lazyberezovsky可能类似于
public void Foo(),其中T:new(string)
表示该类型有一个以单个字符串作为参数的构造函数。为什么不使用一个接口来定义并使用它呢?不要使用构造函数,而是创建一个
Initialize
方法来接收您需要的内容。我们已经在使用它了。问题不在默认实现中。问题是工厂必须知道每个已解析依赖项的这些附加参数。@Voronip如果您不想让工厂知道依赖项,那么您可能需要将依赖项重构到另一个类中。我想让工厂知道它可以为正在构造的依赖项提供的依赖项。唯一的问题是,开发人员只允许通过添加一些与构造过程无关的参数来更改构造函数。是的,我必须将类重构回同一个构造函数。