具有默认参数的统一构造函数

本文关键字:构造函数 参数 默认 | 更新日期: 2023-09-27 18:32:24

使用默认参数注入构造函数的问题。

例如

container.RegisterType<IAddressImportRepository, AddressImportRepository>(
    new PerRequestLifetimeManager());
public AddressImportRepository(
    FairFlexxDbContext context, bool isUseSecurePredicate = true)
    : base(context, isUseSecurePredicate)
{
}

错误:

[无效操作异常:布尔值类型没有 可访问的构造函数。
Microsoft.Practices.ObjectBuilder2.DynamicMethodConstructorStrategy.ThrowForNullExistingObject(IBuilderContext 上下文) +239 lambda_method(闭包 , IBuilder上下文) +60
Microsoft.Practices.ObjectBuilder2.<>c__DisplayClass1.b__0(IBuilderContext 上下文) +71
Microsoft.Practices.ObjectBuilder2.DynamicMethodBuildPlan.BuildUp(IBuilderContext 上下文) +42
Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp(IBuilderContext 上下文) +333
Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext 上下文) +274
Microsoft.Practices.ObjectBuilder2.BuilderContext.NewBuildUp(NamedTypeBuildKey 新构建密钥) +167
Microsoft.Practices.Unity.ObjectBuilder.NamedTypeDependencyResolverPolicy.Resolve(IBuilderContext 上下文) +101 lambda_method(闭包 , IBuilder上下文) +425
Microsoft.Practices.ObjectBuilder2.<>c__DisplayClass1.b__0(IBuilderContext 上下文) +71
Microsoft.Practices.ObjectBuilder2.DynamicMethodBuildPlan.BuildUp(IBuilderContext 上下文) +42
Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp(IBuilderContext 上下文) +333
Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext 上下文) +274
Microsoft.Practices.ObjectBuilder2.BuilderContext.NewBuildUp(NamedTypeBuildKey 新构建密钥) +167
Microsoft.Practices.Unity.ObjectBuilder.NamedTypeDependencyResolverPolicy.Resolve(IBuilderContext 上下文) +101 lambda_method(闭包 , IBuilder上下文) +222
Microsoft.Practices.ObjectBuilder2.<>c__DisplayClass1.b__0(IBuilderContext 上下文) +71
Microsoft.Practices.ObjectBuilder2.DynamicMethodBuildPlan.BuildUp(IBuilderContext 上下文) +42
Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp(IBuilderContext 上下文) +333
Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext 上下文) +274
Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t, Object 现有、字符串名称、IEnumerable'1 解析器覆盖)+383

具有默认参数的统一构造函数

Unity

使用反射来确定构造函数参数类型。 使用构造函数,它找到了参数 FairFlexxDbContext 和 bool。 它尝试构造每种类型的实例,但在布尔值上失败,因为它是值类型。 它无法识别您为克服此错误而提供的默认值。

要使其正常工作,您有几个选择。 要么告诉注册你的IAddressImportRepository InjectionConstructor并告诉它如何解析构造函数参数,要么将布尔参数移动到属性。 由于 bool 是一个可选参数,我建议将其移动为属性。

container.RegisterType<IAddressImportRepository, AddressImportRepository>(
    new PerRequestLifetimeManager(), 
    new InjectionConstructor(new ResolvedParameter<FairFlexxDbContext>(), true));

public AddressImportRepository(FairFlexxDbContext context)
    : base(context, true)
{
    IsUseSecurePredicate = true;
}
public bool IsUseSecurePredicate { get; set; }