2010-11-24 22 views
2

J'ai une classe "Adapter" qui enveloppe un objet appelé "X_Session". Cet adpater attend un ILogger et ICacheManager. La façon dont j'y ai pensé est de définir cette classe avec Unity et de la laisser résoudre les deux interfaces qui sont entrées en tant qu'entrées du constructeur.Paramètres UnityContainer et constructeur

Qu'en est-il de l'objet X_Session? Il n'est pas enregistré par Unity, car je dois le créer moi-même car son constructeur nécessite des paramètres d'entrée que je rassemble à partir de QueryString. Est-ce que je résous la classe Adpater puis définissez l'objet X_Session? Autre meilleure façon?

Merci

Répondre

0

Encore une fois, avec une usine abstraite est simple:

public interface IAdapterFactory { 
    Adapter Create(ISession session); 
} 

public class AdapterFactoryImpl : IAdapterFactory { 
    public AdapterFactoryImpl(IDependency dep) { 
     this._dep = dep; 
    } 

    public Adapter Create(ISession input) { 
    return new Adapter(_dep, input); 
    } 
} 

Vous devez vous inscrire dans l'unité que l'usine.

+0

Merci Onof :). Le problème est que l'objet X_Session n'a pas d'interface. Il appartient à une API existante que j'utilise. Donc, peut-être, comme notre collègue l'a suggéré ci-dessous, j'inscris l'adaptateur avec Unity avec l'entrée X_Session dans le constructeur et j'injecte manuellement le X_Session. Qu'est-ce que tu penses? – Bill

+0

Devinez j'ai mal compris votre point! Je ne laisse pas Unity savoir quoi que ce soit sur ISession. Cela ne m'apporte qu'une instance de IAdpaterFactory et laisse l'application injecter un objet ISession ou Session dans le constructeur Adpater. Qu'en est-il de l'Adpater, est-ce que je n'ai pas besoin de l'enregistrer dans Unity? Et pourquoi? – Bill

+0

Vous ne pouvez pas enregistrer l'adaptateur dans Unity si l'objet de session doit être construit et que Unity n'en sait rien. Vous avez besoin de l'usine car l'adaptateur a besoin d'une entrée non résolvable par Unity. – onof

0

Une autre idée serait enregistrer l'objet X_Session à l'intérieur du conteneur unité à l'exécution, puis d'avoir à injecter l'unité de toutes les dépendances.

+0

Comme je l'ai dit, l'objet X_session doit être créé par un constructeur qui accepte les entrées. Ces entrées, l'application elle-même a besoin de les injecter comme ils sont extraits de QueryString et d'autres de base de données. – Bill

+0

ok, mais vous pouvez le créer en vous enregistrant dans Unity. Une fois cela fait, vous pouvez créer la classe Adapter et Unity injectera également des dépendances X_Session. – Simone

+0

@Simone c'est dangereux. Lorsqu'une nouvelle session démarre, vous écrasez l'instance existante dans le conteneur. – onof