DDD领域模型企业级系统Linq的CRUD(四)
建造一个Product Module类:
ProductDBContextDataContext dbcontext = new ProductDBContextDataContext(); public List<Product> GetProducts() { var query = dbcontext.Product.Where(p => p.cid == 1).ToList(); return query; } public object GetProductCS() { var query = from c in dbcontext.ProductCategory join p in dbcontext.Product on c.cid equals p.cid where p.cid == 1 select new { CName = c.cname, PName = p.pname, UnitPrice = p.unitprice }; return query.ToList(); } public List<Product> GetAllProducts(int skipcount, int currentpagecount) { var query = dbcontext.Product.Skip(skipcount).Take(currentpagecount).ToList(); return query; } public void AddCP() { ProductCategory pc = new ProductCategory(); pc.cid = 3; pc.cname = "c3"; Product p1 = new Product(); p1.pid = 5; p1.pname = "p5"; Product p2 = new Product(); p2.pid = 6; p2.pname = "p6"; pc.Product.Add(p1); pc.Product.Add(p2); dbcontext.ProductCategory.InsertOnSubmit(pc); dbcontext.SubmitChanges(); } public void Modifyp() { var product = dbcontext.Product.Where(p => p.pid == 5).SingleOrDefault(); product.unitprice = 200; dbcontext.SubmitChanges(); } public void DeleteP() { var product = dbcontext.Product.Where(p => p.pid == 5).SingleOrDefault(); dbcontext.Product.DeleteOnSubmit(product); dbcontext.SubmitChanges(); } public void DeletePS() { var product = dbcontext.Product.Where(p => p.pid == 5).ToList(); dbcontext.Product.DeleteAllOnSubmit(product); dbcontext.SubmitChanges(); }
静态页面:
<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="LinqToSQLWeb._Default" %> <asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="server"> <asp:GridView ID="GridView1" runat="server"> </asp:GridView> <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="显示产品" /> <asp:Button ID="Button2" runat="server" OnClick="Button2_Click" Text="连接显示产品" /> <br /> <asp:TextBox ID="TextBox1" runat="server">1</asp:TextBox> <br /> <asp:Button ID="Button3" runat="server" OnClick="Button3_Click" Text="显示所有产品" /> <asp:Button ID="Button4" runat="server" OnClick="Button4_Click" Text="上一页" /> <asp:Button ID="Button5" runat="server" OnClick="Button5_Click" Text="下一页" /> <br /> <asp:Button ID="Button6" runat="server" OnClick="Button6_Click" Text="添加" /> <asp:Button ID="Button7" runat="server" OnClick="Button7_Click" Text="修改" /> <asp:Button ID="Button8" runat="server" OnClick="Button8_Click" Text="删除" /> </asp:Content>
后台类:
Product.Domain.Products products = new Product.Domain.Products(); protected void Page_Load(object sender, EventArgs e) { } protected void Button3_Click(object sender, EventArgs e) { TextBox1.Text = "1"; GetProductsBinding(2); } protected void Button4_Click(object sender, EventArgs e) { if (int.Parse(TextBox1.Text) > 0) { TextBox1.Text = (int.Parse(TextBox1.Text) - 1).ToString(); } GetProductsBinding(2); } protected void Button5_Click(object sender, EventArgs e) { TextBox1.Text = (int.Parse(TextBox1.Text) + 1).ToString(); GetProductsBinding(2); } private void GetProductsBinding(int count) { List<Product.Domain.Product> allproducts; if (int.Parse(TextBox1.Text) == 0) { allproducts = products.GetAllProducts(0, count).ToList(); } allproducts = products.GetAllProducts((int.Parse(TextBox1.Text) - 1) * 2, count); GridView1.DataSource = allproducts; GridView1.DataBind(); } protected void Button6_Click(object sender, EventArgs e) { products.AddCP(); } protected void Button7_Click(object sender, EventArgs e) { products.Modifyp(); } protected void Button8_Click(object sender, EventArgs e) { products.DeleteP(); }
EF的实例:
ProductSystemModelContainer productdbcontext = new ProductSystemModelContainer(); public List<Product> GetAllProduct(int page,int count) { var query = productdbcontext.Product.Skip(page * count).Take(count).ToList(); return query; } public object GetAllPC(int page, int count) { var query = productdbcontext.ProductCategory.Join(productdbcontext.Product, c => c.Id, p => p.ProductCategory.Id, (c, p) => new { CName = c.CategoryName, PName = p.ProductName, UnitPrice = p.UnitPrice }).OrderBy(p=>p.UnitPrice).Skip(page * count).Take(count).ToList(); return query; } public void AddProduct() { ProductCategory c = new ProductCategory(); c.Id = Guid.NewGuid(); c.CategoryName = "c1"; Product p = new Product(); p.Id = Guid.NewGuid(); p.ProductName = "p1"; p.UnitPrice = 80; p.ProductCategory = c; productdbcontext.Set<ProductCategory>().Add(c); productdbcontext.Set<Product>().Add(p); productdbcontext.SaveChanges(); } public void ModifyProduct() { var product = productdbcontext.Product.Where(p => p.ProductName == "p1").FirstOrDefault(); product.UnitPrice = 55; productdbcontext.Entry(product).State = System.Data.Entity.EntityState.Modified; productdbcontext.SaveChanges(); } public void RemoveProduct() { var product = productdbcontext.Product.Where(p => p.ProductName == "p1").FirstOrDefault(); productdbcontext.Set<Product>().Remove(product); productdbcontext.SaveChanges(); }
前端代码:
<asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="server"> <br /> <asp:TextBox ID="TextBox1" runat="server">0</asp:TextBox> <asp:GridView ID="GridView1" runat="server"> </asp:GridView> <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="创建" /> <asp:Button ID="Button2" runat="server" OnClick="Button2_Click" Text="上一页" /> <asp:Button ID="Button3" runat="server" OnClick="Button3_Click" Text="下一页" /> <asp:Button ID="Button4" runat="server" OnClick="Button4_Click" Text="修改" /> <asp:Button ID="Button5" runat="server" OnClick="Button5_Click" Text="销毁" /> </asp:Content>
后台代码:
LINQEFService efservice = new LINQEFService(); protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { Bind(); } } private void Bind() { var result = efservice.GetAllPC(int.Parse(TextBox1.Text), 2); GridView1.DataSource = result; GridView1.DataBind(); } protected void Button1_Click(object sender, EventArgs e) { efservice.AddProduct(); Bind(); } protected void Button2_Click(object sender, EventArgs e) { if (int.Parse(TextBox1.Text) > 0) { TextBox1.Text = (int.Parse(TextBox1.Text) - 1).ToString(); Bind(); } } protected void Button3_Click(object sender, EventArgs e) { TextBox1.Text = (int.Parse(TextBox1.Text) + 1).ToString(); Bind(); } protected void Button4_Click(object sender, EventArgs e) { efservice.ModifyProduct(); Bind(); } protected void Button5_Click(object sender, EventArgs e) { efservice.RemoveProduct(); Bind(); }
直接实例化服务端的弊端:
Service Locator体系架构模式:
实例:
定义接口:IPrintService
public interface IPrintService { string Print(string msg); }
子类PrintSerivceNew:
public class PrintSerivceNew:IPrintService { public string Print(string msg) { return "SerivceNew:" + msg; } }
子类:PrintService
public class PrintService : IPrintService { public string Print(string msg) { return "Serivce1:" + msg; } }
服务工厂ServiceFactory
public abstract class ServiceFactory { public object GetService() { return this.DoGetService(); } public abstract object DoGetService(); public abstract Type SerivceType { get; } }
具体实现工厂:PrintServiceFactory
public class PrintServiceFactory:ServiceFactory { public override object DoGetService() { return new PrintSerivceNew(); } public override Type SerivceType { get { return typeof(IPrintService); } } }
具体的业务:
public class ServiceLocator { private Dictionary<Type, ServiceFactory> servicedics = new Dictionary<Type, ServiceFactory>(); public ServiceLocator() { foreach(var type in this.GetType().Assembly.GetExportedTypes()) { if(type.IsSubclassOf(typeof(ServiceFactory))) { var factory = (ServiceFactory)Activator.CreateInstance(type); servicedics.Add(factory.SerivceType, factory); } } } public object GetServiceByType(Type type) { var factory = servicedics[type]; return factory.GetService(); } }
调用:
static void Main(string[] args) { ServiceLocator servicelocator = new ServiceLocator(); var objectservice=servicelocator.GetServiceByType(typeof(IPrintService)); Console.WriteLine((objectservice as IPrintService).Print("hello")); Console.ReadLine(); }