2009-07-12 5 views
1

J'utilise StructureMap depuis un certain temps mais je suis loin d'être un expert. Mon problème est simple, j'essaie de configurer SM via du code (Registry) pour utiliser un constructeur particulier lors de la création d'une instance d'un objet de référentiel.Définir le constructeur par défaut avec StructureMap sans fournir d'arguments ou en utilisant l'attribut DefaultConstructor

Voici mes 2 constructeurs (notez que ce n'est pas le plus gourmand).

public BusinessUnitRepository(IDatabase database) 
    : base(database) { 

} 

public BusinessUnitRepository(IDatabaseFactory factory) 
    : base(factory) { 

} 

Note: Le premier constructeur prend une instance de l'interface IDatabase et est appelé par le cteur de la classe de base (IDatabaseFactory) de mise en œuvre. Ce que j'essaie de faire est de configurer SM pour utiliser le second constructeur et fournir une instance de DatabaseFactory à partir du conteneur SM. Je ne peux pas utiliser l'attribut [DefaultConstructor] dans l'assembly où BusinessUnitRepository est défini afin que cette option soit hors de la table.

Mon code d'enregistrement

ForRequestedType<IDatabaseFactory>() 
    .CacheBy(InstanceScope.PerRequest) 
    .TheDefaultIsConcreteType<DatabaseFactory>(); 


ForRequestedType<Repository.IBusinessUnitRepository>() 
    .CacheBy(InstanceScope.PerRequest) 
    .TheDefault.Is.OfConcreteType<BusinessUnitRepository>().CtorDependency<IDatabaseFactory>().Is<DatabaseFactory>(); 

Quand je lance le programme SM lance une 302 erreur en essayant de créer une instance de BusinessUnitRepository.

StructureMap.StructureMapException: StructureMap Exception Code: 302 
There is no argument of type Repository.LinqToSql.IDatabaseFactory for concrete type Repository.LinqToSql.BusinessUnitRepository 

Pour votre information:

  • Si je fais StructureMap de référence dans l'ensemble de Repository.LinqToSql.BusinessUnitRepository et utiliser les touches [DefaultConstructor] attribut sur mon tout constructeur IDatabaseFactory fonctionne parfaitement.
  • Aussi je l'ai confirmé que StructureMap ne contient une configuration 'Repository.LinqToSql.DatabaseFactory'

Répondre

0

J'ai trouvé une solution, mais la 'magie' a une mauvaise odeur:

ForRequestedType<Repository.IBusinessUnitRepository>() 
      .CacheBy(InstanceScope.PerRequest) 
      .TheDefault.Is.OfConcreteType<BusinessUnitRepository>() 
      .CtorDependency<IDatabaseFactory>("factory").IsTheDefault(); 

SelectConstructor<BusinessUnitRepository>(() => new BusinessUnitRepository((IDatabaseFactory)null)); 

Je pense toujours là est une meilleure réponse. Comme j'ai quelques interfaces Repository et une implémentation concrète, il semble que beaucoup de travail pour définir le SelectConstructor pour chaque type. Je suis ouvert aux suggestions.

+0

Quelle classe implémente IBusinessUnitRepository? Si vous avez une suggestion sur la façon dont vous pensez que cela devrait fonctionner, veuillez poster sur la liste de diffusion StructureMap. http://groups.google.com/group/structuremap-users –

+0

Joshua, BusinessUnitRepository implémente IBusinessUnitRepository. – njappboy

Questions connexes