2017-08-10 1 views
0

Dans ma quête pour savoir l'unité, je veux enregistrer un type qui, comme un « type enregistré » comme paramètre du constructeur.Comment injecter un paramètre « enregistrer tapé » dans un constructeur

Dans mon fichier Bootstrapper.cs J'ai cette configuration:

container.RegisterType<IRepository<User>, UserRepository>(); 
container.RegisterType<BaseService<User>, UserService>(); // <-- Should I inject the parameter here ? 
container.RegisterType<IFactory<BaseService<User>>, Factory<UserService>>(); // <-- or here 

Maintenant, c'est la mise en œuvre de la classe BaseService:

public abstract class BaseService<TModel> 
{ 
    private readonly IRepository<TModel> _repository; 

    // Injected parameter in constructor 
    public BaseService(IRepository<TModel> repository) 
    { 
     _repository = repository; 
    } 
} 

Ma question est de savoir comment injecter dans le constructeur BaseService la paramètre résolu par cette ligne: container.RegisterType, UserRepository>(); ?

J'ai vérifié que j'utiliser le InjectedParameter, mais je ne sais pas comment utiliser correctement dans ce cas.

Merci,

EDIT

ici est l'autre mise en œuvre:

UserService:

public class UserService : BaseService<User> 
{ 
    public UserService(IRepository<User> repository) : base(repository) 
    { 
    } 
} 

usine:

public class Factory<T> : IFactory<T> where T : new() 
{ 
    public T Create() 
    { 
     return new T(); 
    } 
} 
+0

Si vous voulez d'abord vous enregistrer 'IRepository ', d'autre part à résoudre et puis enregistrez 'BaseService ' que dependend à 'IRepository ' de l'étape 2, alors 'InjectionConstructor' vous aidera. Si vous voulez enregistrer uniquement '' IRepository et résoudre '' BaseService ailleurs (pas de fichier de configuration (Bootstrapper.cs)) vous devez utiliser 'DependencyOverride' pour elle. Il sera plus utile si vous donner un exemple où et comment vous voulez résoudre 'BaseService ' –

Répondre

0

Quel est le problème avec votre code? De mon point de vue, cela devrait fonctionner sans modifications. Si vous laissez Unity créer un objet BaseService<User>, il crée une instance UserService. Je pensais que la définition est:

public class UserService : BaseService<User> 
{ 
    ... 
} 

Parce que vous avez déjà enregistré IRepository<User>, il devrait y avoir aucun problème à résoudre/injecter une instance de UserRepository. Le problème est la contrainte new() dans la classe Factory<T>. Unity (et StructureMap, aussi) sont capables d'utiliser un Func<> pour résoudre les dépendances enregistrées. Ainsi, vous pouvez changer votre Factory<T> classe:

public class Factory<T> : IFactory<T> 
{ 
    private readonly Func<T> _creator; 

    public Factory(Func<T> creator) 
    { 
    if(creator == null) 
     throw new ArgumentNullException("creator"); 

    _creator = creator; 
    } 

    public T Create() 
    { 
    return _creator(); 
    } 
} 

enregistrer cette usine générique une fois:

container.RegisterType(typeof(IFactory<>), typeof(Factory<>)); 
+0

J'ai un message d'erreur dans VS: « UserService » doit être un type non abstrait avec une parameterless publique construtctor afin de l'utiliser comme le paramètre 'T' dans le type générique ou la méthode 'Factory ' – Florian

+0

@Florian: OK. J'utilise StructureMap comme conteneur DI, donc peut-être que nous devons faire plusieurs expériences, car Unity fonctionne un peu différemment. Tout d'abord, je suggère d'enregistrer une nouvelle interface, par ex.IService au lieu de BaseService . Cela est plus logique, car BaseService fournit des détails d'implémentation partagés pour les classes dérivées, et normalement, nous enregistrons le contrat et l'implémentation pendant l'amorçage de la DI. Ainsi, dérivez votre UserService à partir de IService et BaseService . Il n'est pas nécessaire de dériver BaseService de IService , mais cela dépend ... – KBO

+0

J'ai exactement la même erreur ... Je ne comprends vraiment pas. En ce qui concerne la définition de la classe UserService. il y a un vide cteur: UserService publique (dépôt IRepository ): base (référentiel) { } – Florian