2009-12-08 4 views
0

Je suis en train de créer un wrapper d'interface pour mon conteneur IOC afin de ne pas avoir de dépendance vis-à-vis d'un conteneur particulier. Mon problème est que certaines des classes de service que j'ai pris dans un companyID qui est une chaîne. Je veux faire des méthodes d'interface génériques commeIOC Container et primitives lors de la création d'un wrapper

T Resolve<T>() où T est l'interface de service.

En ce moment, j'utilise StructureMap dans les coulisses et savoir si le constructeur en béton prend dans le COMPANYID donc je vais faire quelque chose comme ceci:

ObjectFactory.With("companyid").EqualTo("someCompanyID").GetInstance<ICompanyService>();

J'envelopper ce genre d'appel dans une méthode d'interface: ICompanyService GetCompanyService(string companyID)

Comme je l'ai maintenant, l'application doit initialiser StructureMaps config et la classe concrète, qui repasse les services, doit en savoir beaucoup sur les constructeurs. Je voudrais que cela n'arrive pas et que le wrapper soit générique. Existe-t-il un bon moyen, sans avoir à ajouter companyID à chaque méthode sur l'interface?

Répondre

2

Personnellement, je ne me soucie pas vraiment de l'abstraction de MSUnity (mon conteneur IOC de choix). Pour moi, c'est un pas de trop. Il semble que vous utilisiez des fonctionnalités spécifiques à Structemap, ce qui rendra l'abstraction plus difficile.

Connaissez-vous le CommonServiceLocator project? Cela a des méthodes principales: deux méthodes

protected override object DoGetInstance(Type serviceType, string key) { } 
protected override IEnumerable<object> DoGetAllInstances(Type serviceType) {} 

Fournir vous vous en tenez à utiliser ceux-ci vous pouvez facilement passer. Voici some more info.

+0

J'ai SM extrait un peu, mais pas complètement. Je regarde une source Open qui a fait un wrapper, mais cela ne tient pas compte des primitives dans les ctors. – CSharpAtl

+0

@ CSharpAtl - reconsidérer votre conception. Des cadres comme ceux-ci doivent fonctionner avec le plus petit dénominateur commun. Vous devez déterminer s'il est plus important de pouvoir désactiver votre IOC que d'utiliser les fonctionnalités spécifiques de StructureMap. – RichardOD

+0

@RichardOD Je suis d'accord. – pattersonc

0

Il existe une classe DependencyResolver dans MvcContrib. Par contre, la plupart du temps, je ne fais que renvoyer le conteneur IoC de mon projet d'application uniquement. Par exemple, je configure simplement mes classes pour l'injection de ctor et quand j'ai besoin d'attraper une instance (dans le projet d'application) je demande simplement le conteneur d'IoC pour cela. Le conteneur IoC peut s'inquiéter du remplissage des arguments ctor mais les objets ne sont pas conscients du conteneur IoC. De cette façon, mon projet d'application est le seul projet qui doit refaire le conteneur IoC.