0

Je crée un nouveau site ASP.Net "not mvc", et je souhaite que la couche d'accès aux données ait 2 versions, l'une utilisant Linq to Sql et l'autre utilisant ad.net entity framework. Note: kigg fait la même chose mais sur le site MVC et trop complexe que je ne le souhaite. J'ai appris que le meilleur modèle pour atteindre mon objectif est l'utilisation du modèle de conception du référentiel.Comment trier ce modèle de référentiel et l'architecture de site Web ASP.Net?

Ma question est, où dans mon code et couches "dal, bal, ui" le commutateur va se passer? en d'autres termes où je vais changer le code pour appliquer le framework linq à sql to ado.net ou vice versa.

j'ai écrit:

IRepository repository; 

Puis dans la classe constuctor

repository = MyRepositoryLinqToSql(); 

quelqu'un peut me enseigner cette architecture une partie sage?

Répondre

1

Si vous voulez créer une architecture connectable pour pouvoir échanger sur la couche de dépôt à la volée, vous devrez créez tout derrière une interface, puis utilisez quelque chose comme StructureMap pour échanger dynamiquement ce dont vous avez besoin quand vous en avez besoin.

Vous voudriez définir une classe de référentiel comme AccountRepository. Un pour linq à sql LSAccountRepository et EFAccountRepository. Ces deux hériterait de IAccountRepository et ont des méthodes telles que GetAccountByID, SaveAccount, DeleteAccount, etc.

Ensuite, en utilisant StructureMap vous auriez la syntaxe comme si pour charger le référentiel approprié en fonction du système que vous chargez dans.

IAccountRepository _accountRepository = ObjectFactory.GetInstance();

Ensuite, via votre configuration, vous pouvez spécifier l'implémentation par défaut de IAccountRepository et l'échanger pour pointer vers l'une ou l'autre des implémentations à tout moment.

Si cela est trop complexe, alors un schéma d'injection de dépendance peut être utilisé en ce que vous pouvez avoir une méthode avec un paramètre de IAccountRepository.Cette méthode serait appelée par un contrôleur (MVP ou MVC) et vous pouvez transmettre la référence appropriée à ce moment-là. De cette façon, vous n'instanciez pas directement le référentiel à l'intérieur de la méthode qui pourrait avoir besoin d'un référentiel par rapport à un autre.

Même si vous décidez de créer un motif DI, vous pouvez toujours utiliser StructureMap. Lorsque vous instanciez un objet ayant d'autres dépendances que StructureMap connaît (dans le constructeur), alors StructureMap chargera également ces objets. Ensuite, l'appelant de l'objet qui a la méthode dont vous avez besoin sera le seul couplage libre qui sera nécessaire car StructureMap s'occupera dynamiquement du sale boulot pour vous.

1

Il s'agit d'une question lourde à laquelle vous devez répondre, mais vous pouvez ajouter un constructeur qui prend en paramètre une instance IRepository et l'utilise dans la classe elle-même. Pour savoir comment le peupler, faites des recherches sur les contenants d'inversion de contrôle comme Spring et Windsor. Ces outils prennent des détails de configuration sur les implémentations spécifiques que vous souhaitez utiliser, puis transmettent automatiquement ces instances aux constructeurs et aux propriétés des classes.

Par exemple, vous pouvez indiquer quelle version de IRepository que vous souhaitez utiliser dans votre fichier app.config et whereever cela apparaît dans un constructeur une instance de votre classe choisie sera transmise.

Questions connexes