MVC+EF+架構設計(三)


發了前面兩篇文章后,有的同學說:“分層應該依項目而定,沒有什么最好的分層,只有最合適的。” 也有同學說 “分層太復雜,才多大的項目”

在這里我想發表下我的看法,個人之言,權當討論的話題:首先說分層應該依項目而定,這話總體來說沒有錯誤,但是到底什么樣的項目該用什么樣的分層

這個沒有定數,至少我還不知道這個確切的分界線~況且,我們現在可能做個小項目,到以后也許慢慢發展起來怎么辦?

對於這個分層是否過於復雜,個人並不是這么看的,至少這么分層,每個分層都有其中不可少的因素在里面。前期搭建好以后,也許項目真的發展起來后,

會有助於項目真正的開發。當然,如果是小項目,個人也覺得沒有必要分太多層。

好了,現在說說,我們這個EF的底層框架怎么搭建。

首先 我們現在數據庫建一個表 Product    表結構如下:

CinDou.EFramework層中建立 CinDouDbContext.cs 文件,代碼如下

using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Data.Entity.ModelConfiguration.Conventions;
using CinDou.Tools;
using CinDou.Model;

namespace CinDou.EFramework
{
    string connection="xxxxx"; //數據庫鏈接

    public class CinDouDbContext : DbContext
    {
        public AppedDbContext()
            : base(connection)
        { }

         public DbSet<Product> Products{get; set;}

         protected override void OnModelCreating(DbModelBuilder modelBuilder)
         {
             modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();//移除復數表名的契約

             modelBuilder.Conventions.Remove<IncludeMetadataConvention>();//防止黑幕交易 要不然每次都要訪問 EdmMetadata這個表
         }
    }
}

  

CinDou.Model 項目中建立 Product.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel.DataAnnotations;

namespace CinDou.Model
{
    public class Product
    {
        public int ID { get; set; }

        [Column("Name")]
        public string ProductName { get; set; }

        [Column("Price")]
        public decimal ProductPrice { get; set; }

        public DateTime CreateDate { get; set; }
    }
}

  

在BFactoy和DFactory層中分別建立BLLFactory。cs 和 DALFactory.cs

using System;
using System.Collections.Generic;
using System.Reflection;
using System.Linq;
using System.Text;
using CinDou.Tools;
using CinDou.IBLL;
using CinDou.BLL;

namespace CinDou.BFactory
{
    public sealed class BLLFactory
    {
        static string bllLayer = WebSite.BLLAssembly;

        public static CinDou.IBLL.IProduct CreateProduct()
        {
            return (CinDou.IBLL.IProduct)Assembly.Load(bllLayer).CreateInstance(bllLayer + ".Product");
        }
    }
}

  

using System.Reflection;
using CinDou.Tools; 
using CinDou.IDAL;
using CinDou.DAL;

namespace CinDou.DFactory
{
    public sealed class DALFactory
    {
        static string dalLayer = WebSite.DALAssembly;

        public static CinDou.IDAL.IProduct CreateProduct()
        {
            return (CinDou.IDAL.IProduct)Assembly.Load(dalLayer).CreateInstance(dalLayer + ".Product");
        }
    }
}

  

這里,我們使用了反射和工廠模式。這樣便於解耦和層的封閉

CinDou.IBLLCinDou.IDAL中分別建立IProduct.cs文件

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CinDou.Model;

namespace CinDou.IBLL
{
    public interface IProduct
    {
        bool Add(CinDou.Model.Product product);

        IEnumerable<CinDou.Model.Product> List();
    }
}

  

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CinDou.Model;

namespace CinDou.IDAL
{
    public interface IProduct
    {
        bool Add(Product product);

        IEnumerable<Product> List();
    }
}

  

然后再在CinDou.BLLCinDou.DAL中建立Product.cs

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CinDou.IBLL;
using CinDou.DFactory;
using CinDou.IDAL;
using CinDou.DAL;
using CinDou.Model;

namespace CinDou.BLL
{
    public class Product : CinDou.IBLL.IProduct
    {
        public bool Add(CinDou.Model.Product product)
        {
            return CinDou.DFactory.DALFactory.CreateProduct().Add(product);
        }
      
        public IEnumerable<CinDou.Model.Product> List()
        {
            return CinDou.DFactory.DALFactory.CreateProduct().List();
        }
    }
}

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Entity;
using CinDou.IDAL;
using CinDou.EFramework;
using CinDou.Model;
using CinDou.Tools;

namespace CinDou.DAL
{
    public class Product : CinDou.IDAL.IProduct
    {
        private CinDouDbContext CinDouDB = new CinDouDbContext;
     

        public bool Add(CinDou.Model.Product product)
        {
            bool flag = false;

            try
            {
                CinDouDB.Products.Add(product);

                CinDouDB.SaveChanges();

                flag = true;
            }
            catch{ }

            return flag;
        }

        public IEnumerable<CinDou.Model.Product> List()
        {
            return CinDouDBProducts.ToList();
        }
    }
}

  

 我們再在CinDou.Route項目中建立 Controllers文件夾,然后建立ProductController.cs文件

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Mvc;
using CinDou.IBLL;
using CinDou.BFactory;

namespace CinDou.Route.Controllers
{

    public class ProductController : Controller
    {
        public ViewResult Index()
        {
           
            return View(CinDou.BFactory.BLLFactory.CreateProduct().List());
        }

        public ActionResult Create()
        {
            return View(new CinDou.Model.Product());
        }

        //
        // POST: /Department/Create
        [HttpPost]
        public ActionResult Create(CinDou.Model.Product product)
        {
            bool flag = CinDou.BFactory.BLLFactory.CreateProduct().Add(product);

            return RedirectToAction("Index");
        }
    }
}

  

 在CinDou.Web項目中的Views文件夾下建立Product文件夾,在里面建立Index.cshtml文件

在建立的時候,借助vs的智能感應,能非常方便的建立index.cshtml文件中的內容。

@model IEnumerable<CinDou.Model.Product>

<p>
    @Html.ActionLink("Create New", "Create")
</p>
<table>
    <tr>
        <th>
            ProductName
        </th>
        <th>
            ProductPrice
        </th>
        <th>
            CreateDate
        </th>
        <th></th>
    </tr>

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.ProductName)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.ProductPrice)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.CreateDate)
        </td>
        <td>
            @Html.ActionLink("Edit", "Edit", new { id=item.ID }) |
            @Html.ActionLink("Details", "Details", new { id=item.ID }) |
            @Html.ActionLink("Delete", "Delete", new { id=item.ID })
        </td>
    </tr>
}

</table>

  項目至此,已經差不多建立完整了。最后再附上我的源碼。便於理解吧~

 

Download

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM