建造一个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();
}

DDD领域模型企业级系统Linq的CRUD(四)的更多相关文章

  1. DDD领域模型企业级系统(二)

    用户层: 1.请求应用层获取用户显示的信息 2.发送命令给应用层要求执行某个命令 应用层: 对用户界面提供各种应用功能(包括信息获取与命令执行),应用层不包含业务逻辑,业务层是由应用层调用领域层(领域 ...

  2. DDD领域模型企业级系统(一)

    领域模型的基本构造块: 1.实体(Entity):有业务生命周期,使用标识进行跟踪. 2.值对象(Value Object):无业务生命周期,用来描述实体. 3.服务(Service):无状态的行为类 ...

  3. DDD领域模型企业级系统Unity(五)

    添加程序集: 写一个接口: public interface IPlayer { void Play(); } 两个实现类: public class NewPlay : IPlayer { publ ...

  4. DDD领域模型企业级系统(三)

    相关代码: public static void ShowArray() { //数据源 int[] arrayas = new int[] { 1, 2, 3, 4 }; //创建查询 var qu ...

  5. DDD领域模型和充血对象

    DDD领域模型 官方说法 领域驱动设计,它是对面向对象的的分析和设计(OOAD,Object Orient Analysis Design)的一个补充,对技术框架进行了分层规划,同时对每个类进行了策略 ...

  6. 如何一步一步用DDD设计一个电商网站(四)—— 把商品卖给用户

    阅读目录 前言 怎么卖 领域服务的使用 回到现实 结语 一.前言 上篇中我们讲述了“把商品卖给用户”中的商品和用户的初步设计.现在把剩余的“卖”这个动作给做了.这里提醒一下,正常情况下,我们的每一步业 ...

  7. 领域模型中的实体类分为四种类型:VO、DTO、DO、PO

    http://kb.cnblogs.com/page/522348/ 由于不同的项目和开发人员有不同的命名习惯,这里我首先对上述的概念进行一个简单描述,名字只是个标识,我们重点关注其概念: 概念: V ...

  8. Linux系统运维笔记(四),CentOS 6.4安装 MongoDB

    Linux系统运维笔记(四),CentOS 6.4安装 MongoDB 1,下载 https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.0.6 ...

  9. Linux系统运维笔记(四),CentOS 6.4安装Nginx

    Linux系统运维笔记(四),CentOS 6.4安装Nginx 1,安装编译工具及库文件 yum -y install make zlib zlib-devel gcc-c++ libtool op ...

随机推荐

  1. java.util.concurrent BlockingQueue详解

    什么是阻塞队列? 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列.这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空.当队列满时,存储元素的线程会等待队列可用.阻塞 ...

  2. oracle 获取当前用户下的所有表名与字段信息

     select *from user_col_commentswhere substr(table_name,1,3)<>'BIN' 

  3. Flume自定义Source、Sink和Interceptor(简单功能实现)

    1.Event event是flume传输的最小对象,从source获取数据后会先封装成event,然后将event发送到channel,sink从channel拿event消费. event由头he ...

  4. HGOI 20181030晚 题解

    Problem:给出全班人的个数总分和小明的分数(满分100分),求小明最低排名和最高排名 sol:假设小明的排名为k,总分为sum,小明的分数是r, 贪心求解, 最坏情况下,小明前面的比小明高一分( ...

  5. 洛谷 P4389 付公主的背包 解题报告

    P4389 付公主的背包 题目背景 付公主有一个可爱的背包qwq 题目描述 这个背包最多可以装\(10^5\)大小的东西 付公主有\(n\)种商品,她要准备出摊了 每种商品体积为\(V_i\),都有\ ...

  6. 解题:NOI 2014 随机数生成器

    题面 为什么NOI2014有模拟题=.=??? 按题意把序列生成出来之后,对每一行维护一个能取到的最左侧和能取到的最右侧.从小到大$O(n^2)$枚举数字看看能否填入,能填入则暴力$O(n)$更新信息 ...

  7. Ajax跨域CORS

    在Ajax2.0中多了CORS允许我们跨域,但是其中有着几种的限制:Origin.Methods.Headers.Credentials 1.Origin 当浏览器用Ajax跨域请求的时候,会带上一个 ...

  8. HTML的自定义属性

    用Angular这些框架的时候会发现一系列的指令,如ng-app.ng-repeat等,这些都属于用户自定义属性 但是HTML5规范要求所有的用户自定义属性以"data-"开头,如 ...

  9. Python常用模块-摘要算法(hashlib)

    Python常用模块-摘要算法(hashlib) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MD5算法参数详解 1.十六进制md5算法摘要 #!/usr/bin/env p ...

  10. PowerDesigner使用64位JDK连接MYSQL填坑记.md

    你在这座城市,做过最孤独的事是什么? 曾经试过销声匿迹,最终只是无人问及! 系统环境 利用powerdesigner反向生成表结构时报: ** connection test failed** 胖先 ...