Création d'objets Entity Framework avec un modèle Unity pour unité de travail / référentiel

.net c# entity-framework repository-pattern unit-of-work

Question

J'essaie d'implémenter le modèle d'unité de travail / référentiel, comme décrit ici: http://blogs.msdn.com/adonet/archive/2009/06/16/using-repository-and-un-un-of-work- patterns-with-entity-framework-4-0.aspx

Cela nécessite que chaque référentiel accepte une implémentation IUnitOfWork, par exemple un datacontext EF étendu avec une classe partielle pour ajouter une interface IUnitOfWork. En fait, j'utilise .net 3.5, pas 4.0. Mon constructeur de base d'accès aux données ressemble à ceci:

public DataAccessLayer(IUnitOfWork unitOfWork,
                       IRealtimeRepository realTimeRepository)
{
    this.unitOfWork = unitOfWork;
    this.realTimeRepository = realTimeRepository;
}

Jusqu'ici tout va bien.

Ce que j'essaie de faire, c'est d'ajouter l'injection de dépendance à l'aide de Unity Framework.

La création du contexte de données EF avec Unity était une aventure, car elle avait du mal à résoudre le constructeur - ce que j'ai finalement fait: créer un autre constructeur dans ma classe partielle avec un nouveau constructeur surchargé, et le marquer avec [InjectionConstructor] .

[InjectionConstructor]
public communergyEntities(string connectionString, string containerName)
    : this()
{
    // ...
}

(Je sais que je dois passer la chaîne de connexion à l'objet de base, ce qui peut attendre qu'une fois tous les objets initialisés correctement)

Donc, en utilisant cette technique, je peux facilement résoudre mon objet cadre d'entité en tant qu'instance IUnitOfWork ainsi:

using (IUnityContainer container = new UnityContainer())
{
    container.RegisterType<IUnitOfWork, communergyEntities>();

    container.Configure<InjectedMembers>()
        .ConfigureInjectionFor<communergyEntities>
            (new InjectionConstructor("a", "b"))

    DataAccessLayer target = container.Resolve<DataAccessLayer>();

    // ...
}

Génial. Ce que je dois faire maintenant, c’est créer la référence à l’objet repository pour DataAccessLayer - le DAL doit seulement connaître l’interface; je suppose donc que je dois l’instancier dans le cadre de l’instruction Unity Resolve, en lui passant le Interface IUnitOfWork.

Dans le passé, j'aurais simplement transmis au constructeur du référentiel la chaîne de connexion à la base de données. Ce dernier aurait disparu, créé un objet Entity Framework local et ne l'aurait utilisée que pendant la durée de vie de la méthode Repository. Cela est différent en ce sens que je crée une instance Entity Framework en tant qu'implémentation IUnitOfWork lors de l'instruction Unity Resolve, et c'est cette instance que je dois passer dans le constructeur du référentiel. Est-ce possible, et si oui, comment?

Je me demande si je pourrais faire du référentiel une propriété et le marquer comme dépendance, mais cela ne résoudra pas le problème de la création du référentiel avec l'objet IUnitOfWork avec lequel le DAL est en cours de résolution.

Je ne suis pas sûr d'avoir bien compris ce modèle et je me ferai un plaisir de donner son avis sur la meilleure façon de le mettre en œuvre. Entity Framework reste, mais Unity peut être remplacé si ce n'est la meilleure approche. Si j'ai tout à l'envers, dites-moi s'il vous plaît

Réponse populaire

Ceci a été reformulé et répondu ici: Unity framework - instance de réutilisation

La solution consiste à utiliser un ContainerControlledLifetimeManager - alias Singleton: http://msdn.microsoft.com/en-us/library/dd203242.aspx



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow