O metodyce DDD
pisałem już we wcześniejszym poście. Tym razem chciałbym się skupić na podejściu związanym z Bounded Context - czyli zawężonym kontekście.
Wzorzec ten omówiłem już wcześniej, tym razem postaram się zaprezentować praktyczny przykład.
Jako przykładową bazę wybrałem AdventureWorksLT, z następującym schematem:
Korzystając z narzędzia Entity Framework Power Tools stworzyłem DbContext jaki z pewnością znany jest większości programistom, piszącym aplikacje używające EF:
Code:
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using ConsoleApplication3.Models.Mapping;
namespace ConsoleApplication3.Models
{
public class AdventureWorksLTContext : DbContext
{
static AdventureWorksLTContext()
{
Database.SetInitializer<AdventureWorksLTContext>(null);
}
public AdventureWorksLTContext()
: base("Name=AdventureWorksLTContext")
{
}
public DbSet<BuildVersion> BuildVersions { get; set; }
public DbSet<ErrorLog> ErrorLogs { get; set; }
public DbSet<sysdiagram> sysdiagrams { get; set; }
public DbSet<Address> Addresses { get; set; }
public DbSet<Customer> Customers { get; set; }
public DbSet<CustomerAddress> CustomerAddresses { get; set; }
public DbSet<Product> Products { get; set; }
public DbSet<ProductCategory> ProductCategories { get; set; }
public DbSet<ProductDescription> ProductDescriptions { get; set; }
public DbSet<ProductModel> ProductModels { get; set; }
public DbSet<ProductModelProductDescription> ProductModelProductDescriptions { get; set; }
public DbSet<SalesOrderDetail> SalesOrderDetails { get; set; }
public DbSet<SalesOrderHeader> SalesOrderHeaders { get; set; }
public DbSet<vGetAllCategory> vGetAllCategories { get; set; }
public DbSet<vProductAndDescription> vProductAndDescriptions { get; set; }
public DbSet<vProductModelCatalogDescription> vProductModelCatalogDescriptions { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new BuildVersionMap());
modelBuilder.Configurations.Add(new ErrorLogMap());
modelBuilder.Configurations.Add(new sysdiagramMap());
modelBuilder.Configurations.Add(new AddressMap());
modelBuilder.Configurations.Add(new CustomerMap());
modelBuilder.Configurations.Add(new CustomerAddressMap());
modelBuilder.Configurations.Add(new ProductMap());
modelBuilder.Configurations.Add(new ProductCategoryMap());
modelBuilder.Configurations.Add(new ProductDescriptionMap());
modelBuilder.Configurations.Add(new ProductModelMap());
modelBuilder.Configurations.Add(new ProductModelProductDescriptionMap());
modelBuilder.Configurations.Add(new SalesOrderDetailMap());
modelBuilder.Configurations.Add(new SalesOrderHeaderMap());
modelBuilder.Configurations.Add(new vGetAllCategoryMap());
modelBuilder.Configurations.Add(new vProductAndDescriptionMap());
modelBuilder.Configurations.Add(new vProductModelCatalogDescriptionMap());
}
}
}
Na początek spróbujemy stworzyć model czy też dziedzinę, która odpowiada klientom:
Code:
public class CustomerContext : DbContext
{
public DbSet<Customer> Customers { get; set; }
public DbSet<CustomerAddress> CustomerAddresses { get; set; }
public DbSet<Address> Addresses { get; set; }
}
Kolejnym kontekstem może być kontekst związany ze sprzedażą:
Code:
public class SalesContex : DbContext
{
public DbSet<Customer> Customers { get; set; }
public DbSet<Product> Products { get; set; }
public SalesOrderDetail SalesOrderDetail { get; set; }
public DbSet<SalesOrderHeader> SalesOrderHeaders { get; set; }
}
Innym jeszcze kontekstem, może być ten opisujący same produkty:
Code:
public class ProductContext : DbContext
{
public DbSet<Product> Products { get; set; }
public DbSet<ProductCategory> ProductCategories { get; set; }
public DbSet<ProductDescription> ProductDescriptions { get; set; }
public DbSet<ProductModel> ProductModels { get; set; }
public DbSet<ProductModelProductDescription> ProductModelProductDescriptions { get; set; }
}
W kolejnym poście zostanie omówione dostosowywanie encji do konkretnych zadań, problem inicjalizacji bazy. Kolejnym tematem będzie wymiana danych pomiędzy różnymi kontekstami.
Brak komentarzy:
Prześlij komentarz