Sørg for, at du har oprettet og registreret en DbContext-klasse i
Startup.cs:
- public void ConfigureServices(IServiceCollection services)
- {
- // Add framework services.
- services.AddDbContext<ApplicationDbContext>(options =>
- options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
-
- // (...)
- }
Lav
services eller
repositories til operationer som eksempelvis hent alle kunder med et bestemt fornavn.
- public interface ICustomerRepository
- {
- IEnumerable<Customer> ByFirstName(string firstName);
- }
- public class CustomerRepository : ICustomerRepository
- {
- #region Fields (private members)
- private readonly ApplicationDbContext _dbContext;
- #endregion
-
-
-
- #region Dependency Injection (controller)
- public CustomerRepository(ApplicationDbContext dbContext)
- {
- _dbContext = dbContext;
- }
- #endregion
-
-
-
- #region Searches
- public IEnumerable<Customer> ByFirstName(string firstName)
- {
- var customers =_dbContext
- .Set<Customer>()
- .AsNoTracking()
- .Where(customer => customer.FirstName.Equals(firstName)
- .ToArray();
-
- return customers;
- }
- #endregion
- }
Du registrerer så repository-interface og -implementering i
Startup.cs- public void ConfigureServices(IServiceCollection services)
- {
- // (...)
-
- // Add application repositories.
- services.AddScoped<ICustomerRepository, CustomerRepository>();
- }
Nu er du klar til at bruge dit repository i en controller.
- public class CustomerController : Controller
- {
- #region Fields (private members)
- private readonly ICustomerRepository _customers;
- #endregion
-
-
-
- #region Dependency Injection (constructor)
- public CustomerController(ICustomerRepository customers)
- {
- _customers = customers;
- }
- #endregion
-
-
-
- #region Actions (public methods)
- public IActionResult Search(string firstName)
- {
- var customers = _customers.ByFirstName(firstName);
-
- return View(customers);
- }
- #endregion
- }
Service- eller repository-laget kan være en mappe kaldet
Data,
Infrastructure eller
Dal i dit MVC-projekt. Er det et større projekt, kan du med fordel lægge laget som et separat projekt i din solution eller måske endda i en solution for sig selv.
Du taler om Domain-Driven Design. Jeg har kun læst op på det, ikke anvendt det i praksis, men mht. ASP.NET, så kan det se ud som følger (Onion-arkitektur):
Solution
|- Core: Domain models + validering, repository- og/eller service-interfaces.
|- Infrastructure: Repositories og/eller services. Alt der har med I/O at gøre (databaseopslag, kald til web services eller andre RPC'er, skrivning eller læsning af filer).
|- Web: Controllers, Views, opsætning af services, konfigurering af IoC
Hertil kommer et testlag. Det kan være en separat solution med et projekt pr. lag, det kan være ét testprojekt, eller det kan være et testprojekt pr. lag.
Læs mere om Onion Architecture i ASP.NET MVC
Indlæg senest redigeret d. 04.11.2016 00:05 af Bruger #17546