2014-11-29 14 views
6

Problema con l'iniezione del costruttore con parametri predefiniti.Unity constructor con parametri predefiniti

Per esempio

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

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

Errore:

[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

risposta

8

unità utilizza la riflessione per determinare i tipi di parametri costruttore. Con il tuo costruttore, ha trovato i parametri FairFlexxDbContext e bool. Prova a costruire un'istanza di ogni tipo e fallisce il bool perché è un tipo di valore. Non riconosce il valore predefinito che hai fornito per superare questo errore.

Per far funzionare tutto questo, ci sono un paio di opzioni. Indica al registro il tuo IAddressImportRepository con un InjectionConstructor e dì allo in che modo risolvere i parametri del costruttore o spostare il parametro bool in una proprietà. Dato che il bool è un parametro opzionale, ti consiglio di spostarlo come proprietà.

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

o

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

public bool IsUseSecurePredicate { get; set; }