Auch wenn Sie keine separate Serviceebene verwenden, können Sie erreichen, was Sie wollen, nämlich die MVC-Anwendung vom DAL-Projekt mit DI zu entkoppeln.
Die Methode besteht darin, ein paar Projekte/Assemblies hinzuzufügen, die Ihren IoC-Container mit bestimmten Instanzen der von Ihnen definierten Schnittstellen verbinden.
ich verwenden in der Regel diese Namenskonvention:
Ihr Haupt MVC-Projekt würde dann einen Verweis auf Ihre Abstract- und Infrastrukturprojekte. Ihr Infrastrukturprojekt würde einen Bezug zu den abstrakten und instanzspezifischen Projekten wie den Business- und DAL-Projekten haben. Innerhalb von Infrastructure projizieren Sie die Abhängigkeiten.
Sie müssen einen Mechanismus für Ihr MVC-Projekt einrichten, um Ihren IoC in der Infrastructure-Assembly zu booten. Sie können dies in Ihrer global.asax- oder als App_Start-Methode ausführen und eine Registration-Klasse in Ihrer Infrastructure-Assembly aufrufen.
Wir verwenden StructureMap, aber das Konzept ist das gleiche. Hier ist ein Beispielcode.
Erstellen Sie in Ihrer MVC-App eine App_Start-Methode zum Einrichten des DI.
public static class StructuremapMvc
{
public static void Start()
{
// Create new Structuremap Controller factory so Structure map can resolve the parameter dependencies.
ControllerBuilder.Current.SetControllerFactory(new StructuremapControllerFactory());
IContainer container = IoC.Initialize();
DependencyResolver.SetResolver(new StructureMapDependencyResolver(container));
GlobalConfiguration.Configuration.DependencyResolver = new StructureMapDependencyResolver(container);
}
}
In Ihrer Infrastructure Assembly verbinden Sie die Abhängigkeiten.
public static class IoC
{
public static IContainer Initialize()
{
ObjectFactory.Initialize(x =>
{
x.Scan(scan =>
{
scan.TheCallingAssembly();
scan.WithDefaultConventions();
});
x.For<IRepositoryNum1>().Use<Num1Repository>();
x.For<IRepositoryNum2>().Use<Num2Repository>();
x.For<IRepositoryNum3>().Use<Num3Repository>();
});
return ObjectFactory.Container;
}
}
Die Verwendung eines Repos bedeutet nicht, dass Sie DI verwenden müssen - sie lösen zwei verschiedene Probleme. –
Ich würde empfehlen, auf "Zwiebel Architektur" zu lesen, ich denke, es ist ein guter Ansatz für Projektreferenzen. Da Ihre UI- und DataAccess-Layer beide außen rechts liegen, sollte es für sie kein Problem darstellen, sich gegenseitig zu referenzieren. – Charlino