niedziela, 2 grudnia 2012

Bounded Context - praktyczny przykład

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