2016-04-25 9 views
5

Moja typowa struktura aplikacji sieci web .NET 4.5X ma co najmniej 3 poziomy: projekt internetowy (aplikacja internetowa .NET), projekt logiczny domeny/biznesu (a biblioteka klasy) i projekt dostępu do danych (biblioteka klasy). Projekt WWW odwołuje się do warstwy biznesowej, a warstwa biznesowa odwołuje się do warstwy dostępu do danych.Tworzenie podstawowej aplikacji dotnet dla 3-warstw z warstwą dostępu do danych

Podoba mi się to podejście, ponieważ mój projekt internetowy nie ma odniesienia do projektu dostępu do danych (musi najpierw przejść przez domenę/warstwę logiki biznesowej). Mój projekt WWW nie powinien mieć żadnego dostępu do klas kontekstu lub repozytorium.

W 3-warstwowej aplikacji 4.5.X.net deklaruję ciąg połączenia w pliku web.config i nazwę DbContext jako atrybutu nazwy ciągu połączenia.

W nowym paradygmacie Dotnet Core każdy przykład widzę ma DbContext skonfigurowany w Startup.cs tak:

public void ConfigureServices(IServiceCollection services) 
{ 
    // Add framework services. 
    services.AddMvc(); 
    services.AddEntityFramework() 
     .AddSqlServer() 
     .AddDbContext<MyApplicationContext>("myconnectionstring or reference to it"); 
} 

dając starcie konkretną klasę używaną w dbcontext, muszę odwołać projekt dostępu do danych, w którym zdefiniowano element dbcontext. Wolałbym tylko odnosić się do środkowej warstwy i unikać odniesienia do DAL.

Moje pytanie brzmi: w jaki sposób należy uporządkować strukturę rozwiązania, aby uniknąć dodawania odwołania z mojego projektu internetowego do mojego projektu dostępu do danych?

Czy mogę użyć właściwości appsettings.json?

Czy mogę dodać moją konfigurację Entity w inny sposób?

Czy jest coś ważnego, czego mi brakuje na temat rdzenia sieciowego?

Z góry dziękuję.

+1

Ta odpowiedź może być przydatna, ponieważ usuwa odniesienie EF w warstwie internetowej http://stackoverflow.com/a/38360204/1544886 –

Odpowiedz

3

znalazłem rozwiązanie używając EF6 i DotNet Rdzeń że jestem dość komfortowo.

Nie używa funkcji services.AddSqlServer() dla EF7, ale raczej używa konfiguracji EF6 i rejestruje DbContext w klasie Bootstrap, która jest wywoływana podczas uruchamiania.

public static class BootstrapConfig 
{ 
    public static void RegisterApplicationServices(this IServiceCollection services, IConfigurationRoot configuration) 
    { 
     // DbContext 
     services.AddScoped<DbContext>(x => new ApplicationContext(configuration["Data:ApplicationContext:ConnectionString"])); 
    } 
} 

Nazywa się to z Startup.cs w projekcie WebLibrary jak

public void ConfigureServices(IServiceCollection services) 
{ 
    // Add framework services. 
    services.AddMvc(); 

    services.RegisterApplicationServices(Configuration); 
} 

enter image description here

WebLibrary jest zastosowanie rdzenia web kropka netto (zawiera sterowniki, jest projekt startowy).

Logika biznesowa to warstwa usługowa, która jest środkową warstwą między aplikacją internetową a projektem dostępu do danych.

Dostęp do danych jest tam, gdzie istnieją klasy dbContext i repozytorium dla wykonania zapytania.

Projekt modelu zawiera obiekty POCO i wyliczenia, a nie obiekty inteligentne, ale kontenery używane w całej aplikacji.

Projekt Bootstrap zawiera odniesienia do projektów logiki biznesowej i dostępu do danych, dzięki czemu może rejestrować usługi i repozytoria kontenera IOC.

Sprawdź przykładowe rozwiązanie github repo. Jeden problem nadal mam, specyficzne dla mojego wniosku jest następująca:

Choć biblioteka internetowa nie mają odniesienie do projektu dostępu do danych, mogę nadal instancję ApplicationContext z jednego z kontrolerów. Cały rozdział tych projektów polegał na tym, że nie mogłem uzyskać kontekstu db bezpośrednio w projekcie internetowym. Nie jestem pewien, czy jest to związane z nową strukturą rozwiązania w Core, czy też w czymś, czego nie jestem świadomy.

+3

Dobra robota w twoich próbach, czasami zastanawiam się, czy warto wszystkich wysiłków, aby zapobiec przenikaniu kontekstu do warstw, które nie powinny być, zaufany zespół kompetentnych programistów prawdopodobnie przejdzie przez to bez nadużywania faktu, że jest dostęp do kontekst –

2

Myślę, że szukasz wzoru Repository. To warstwa między Twoją firmą a DAL.

Oto sposób, w jaki zorganizowałem najnowsze rozwiązanie, aby uniknąć znajomości interfejsu użytkownika.

enter image description here

+0

Dziękuję za odpowiedź. Mam świadomość schematu repozytorium. W projekcie dostępu do danych opisanym powyżej tworzę moje klasy repozytoriów, które są zużywane przez klasy usług w warstwie środkowej (logiki biznesowej). Klasy usług są następnie pobierane przez moich członków sieci (zwykle kontrolerów mvc/api). Moim głównym zmartwieniem jest unikanie odniesienia projektu z projektu klienta/strony internetowej do warstwy danych. – rictionaryFever

+0

Można więc utworzyć inny projekt dla swojego repozytorium i odnieść go do warstwy danych. i czy Twój projekt internetowy odwołuje się do nowego projektu repozytorium? –

+0

Dzięki za obserwację. Widzę użyteczność sugerowanej struktury projektu i nie mam problemu z jej implementacją za pomocą aplikacji .NET 4, ale moim głównym problemem jest zrozumienie sposobu implementacji warstw z .NET Core (.NET 5). Możliwe, że zupełnie nie rozumiem. Niezależnie od tego, z jakiego rozwiązania skorzystam, zaktualizuję to pytanie za pomocą mojego rozwiązania. W .NET Core możesz dodać swój dbcontext jako usługę do Startup.cs. Chcę zachować ten dbcontext z projektu aplikacji internetowej. – rictionaryFever

Powiązane problemy