繁体   English   中英

具有默认参数的Unity构造函数

[英]Unity constructor with default params

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

例如

container.RegisterType<IAddressImportRepository, AddressImportRepository>(
    new PerRequestLifetimeManager());

public AddressImportRepository(
    FairFlexxDbContext context, bool isUseSecurePredicate = true)
    : base(context, isUseSecurePredicate)
{
}

错误:

[InvalidOperationException:类型Boolean没有可访问的构造函数。]
Microsoft.Practices.ObjectBuilder2.DynamicMethodConstructorStrategy.ThrowForNullExistingObject(IBuilderContext context)+239 lambda_method(Closure,IBuilderContext)+60
Microsoft.Practices.ObjectBuilder2。<> c__DisplayClass1.b__0(IBuilderContext context)+71
Microsoft.Practices.ObjectBuilder2.DynamicMethodBuildPlan.BuildUp(IBuilderContext context)+42
Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp(IBuilderContext context)+333
Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context)+274
Microsoft.Practices.ObjectBuilder2.BuilderContext.NewBuildUp(NamedTypeBuildKey newBuildKey)+167
Microsoft.Practices.Unity.ObjectBuilder.NamedTypeDependencyResolverPolicy.Resolve(IBuilderContext context)+101 lambda_method(Closure,IBuilderContext)+425
Microsoft.Practices.ObjectBuilder2。<> c__DisplayClass1.b__0(IBuilderContext context)+71
Microsoft.Practices.ObjectBuilder2.DynamicMethodBuildPlan.BuildUp(IBuilderContext context)+42
Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp(IBuilderContext context)+333
Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context)+274
Microsoft.Practices.ObjectBuilder2.BuilderContext.NewBuildUp(NamedTypeBuildKey newBuildKey)+167
Microsoft.Practices.Unity.ObjectBuilder.NamedTypeDependencyResolverPolicy.Resolve(IBuilderContext context)+101 lambda_method(Closure,IBuilderContext)+222
Microsoft.Practices.ObjectBuilder2。<> c__DisplayClass1.b__0(IBuilderContext context)+71
Microsoft.Practices.ObjectBuilder2.DynamicMethodBuildPlan.BuildUp(IBuilderContext context)+42
Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp(IBuilderContext context)+333
Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context)+274
Microsoft.Practices.Unity.UnityContainer.DoBuildUp(类型t,对象存在,字符串名称,IEnumerable`1 resolverOverrides)+383

Unity使用反射来确定构造函数参数类型。 使用构造函数,它找到了参数FairFlexxDbContext和bool。 它试图构造每种类型的实例并在bool上失败,因为它是一个值类型。 它无法识别您提供的默认值以通过此错误。

为了实现这一点,您有几个选择。 使用InjectionConstructor告诉注册表IAddressImportRepository ,并告诉它如何解析构造函数参数或将bool参数移动为属性。 由于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; }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM