2014-11-29 8 views
6

Problem mit der Injektion von Konstruktor mit Standardparametern.Unity-Konstruktor mit Standardparametern

Zum Beispiel

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

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

Fehler:

[InvalidOperationException: The type Boolean does not have an accessible constructor.]
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(Type t, Object existing, String name, IEnumerable`1 resolverOverrides) +383

Antwort

8

Unity verwendet Reflektion der Konstruktor Parametertypen zu bestimmen. Mit Ihrem Konstruktor hat es die Parameter FairFlexxDbContext und bool gefunden. Es versucht, eine Instanz jedes Typs zu erstellen, und schlägt auf dem Bool fehl, weil es ein Werttyp ist. Der Standardwert, den Sie angegeben haben, um diesen Fehler zu umgehen, wird nicht erkannt.

Damit dies funktioniert, haben Sie ein paar Optionen. Entweder sagen Sie dem Register Ihre IAddressImportRepository mit einer InjectionConstructor und sagen Sie ihm wie, um Ihre Konstruktorparameter aufzulösen oder Ihren bool-Parameter stattdessen als Eigenschaft zu setzen. Da der bool ein optionaler Parameter ist, würde ich empfehlen, ihn als Eigenschaft zu verschieben.

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

oder

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

public bool IsUseSecurePredicate { get; set; }