2010-10-22 21 views
0

Je suis nouveau dans Unity, mais cette question est plus générique pour IoC, et je suis assez nouveau pour implémenter l'IoC dans son ensemble. Je solution VS2010 avec cette structure de projet (simplifié légèrement): - (. Classe Lib PRJ)IRepository, IService, Unity dans une application ASP.NET MVC, question de référence

  • Business Objects Folder
    • DomainModel - Entity Framework 2 entités POCO
  • de couche de données - Dossier
    • DataAccess (classe Lib PRJ.) - EF2 EDMX
    • Repository (classe Lib PRJ.) - Interface IRepository & référentiel implémentations concrètes
  • Présentation Couche - dossier
    • WebUI - MVC Projet
  • service couche
    • service (classe Lib PRJ.) - Interface IService et service (modèle de façade) réalisations concrètes

Tous les projets font référence au projet DomainModel.

Le référentiel fait référence au projet DataAccess.

La couche Service fait référence au projet Repository. WebUI fait référence au projet de service & les assemblages Unity.

Unity est configuré pour injecter correctement tous mes types de service dans l'interface utilisateur Web (global.asax via un UnityControllerFactory.cs personnalisé). Mais comment configurer Unity dans la couche de service pour injecter les objets du référentiel?

Je ne veux pas faire référence au projet Repository à partir de l'interface Web pour garantir que personne ne court-circuera et ne court-circuera la couche Service pendant le développement.

Idées Couple j'ai (pas sûr si elle le résoudre):

  1. Déplacer les interfaces IRepository dans le DomainModel et ajoutez les Unity.RegisterType <> demande la IRepository
  2. Mettre en place la configuration de l'unité dans le Web.config

Toute direction serait grandement appréciée, en particulier pour configurer Unity pour la couche de service/Référentiel, mais aussi en général pour le projet.

Répondre

2

Ajoutez un programme d'amorçage dans le projet Service. Ensuite, référencez le programme d'amorçage dans l'interface Web. Un moyen de le faire serait d'écrire une petite extension Unity.Quelque chose comme ceci:

public class ServiceLayerBootstrap : UnityContainerExtension 
{ 
    protected override void Initialize() 
    { 
     Container.RegisterType<IRepository, WhateverRepositoryImplementation>(); 
     // etc. 
    } 
} 

Ensuite, dans le projet web où vous créez le conteneur et l'initialiser, faites ceci:

var container = new UnityContainer() 
    .AddNewExtension<ServiceLayerBootstrap>(); 
+0

Merci qui était exactement ce que je cherchais. – SCEV