Code Copied

Unity教程系列(二) 简单ASP.NET MVC示例

本文介绍了如何逐步创建一个基于MVC和Unity的简单应用程序。

1. 创建ASP.NET MVC应用程序

image

image

2. 安装Unity到MVC应用程序

Unity MVC的命令如下:

image

在Package Mange Console中输入命令安装。

image

image

image

3. 编写Model, DataProvider, Repository, Controller和View

以上已经搭建完成了一个最简单的基于Unity的MVC项目,如果让这个应用程序实现从DB到View的展现,我们至少要经历下面5个步骤。
①Model:领域模型(领域模型其实很复杂,下面的示例中简单的做了一个Model Class)
②Data Provider:数据提供程序(可以是关系型数据库,也可以是文件等,下面的示例做了一个模拟的Data Provider)
③Repository:数据仓储层(提供了实体和数据提供程序间的共通CURD方法)
④Contoller:控制器
⑤View:页面展现视图

image

3.1 编写Model

添加一个Product.cs:

public class Product
{
    public int Id { get; set; }
    public string Code { get; set; }
    public string Name { get; set; }
}

3.2 编写Data Prpvider

添加一个模拟的Data Provider类MockDataProvider:

namespace MvcApp.Data
{
    public class MockDataProvider : IDisposable
    {
        public IList<Product> Products { get; set; }

        public MockDataProvider()
        {
            Initilize();
        }

        private void Initilize()
        {
            Products = new List<Product>
            {
                new Product {Id = 1, Code = "001", Name = "Cherry Keyboard E75282"},
                new Product {Id = 2, Code = "002", Name = "Thinkpad T440S "},
                new Product {Id = 3, Code = "003", Name = "Logitech Mouse M215 "}
            };
        }

        public void Dispose()
        {
            
        }
    }
}

3.3 编写Repository

添加接口IProductRepository

public interface IProductRepository : IDisposable
{
    IEnumerable<Product> GetAll();
    Product Find(int id);
    bool Save(Product product);
    bool Update(Product product);
    bool Delete(int id);
}

添加实现类ProcuctRepository

public class ProductRepository : IProductRepository
    {
        private MockDataProvider db = new MockDataProvider();

        public IEnumerable<Product> GetAll()
        {
            return db.Products;
        }

        public Product Find(int id)
        {
            return db.Products.First(p => p.Id == id);
        }

        public bool Save(Product product)
        {
            try
            {
                db.Products.Add(product);
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }

        public bool Update(Product product)
        {
            try
            {
                for (var i = 0; i < db.Products.Count; i++)
                {
                    if (db.Products[i].Id == product.Id)
                    {
                        db.Products[i] = product;
                        break;
                    }
                }
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }

        public bool Delete(int id)
        {
            try
            {
                Product product = Find(id);
                db.Products.Remove(product);
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }

        public void Dispose()
        {
            db.Dispose();
        }
    }

3.4 在Unity中注册IProductRepository

修改UnityConfig的RegisterTypes方法,注册IProductRepository

public static void RegisterTypes(IUnityContainer container)
{
    // NOTE: To load from web.config uncomment the line below. Make sure to add a Microsoft.Practices.Unity.Configuration to the using statements.
    // container.LoadConfiguration();

    // TODO: Register your types here
    container.RegisterType<IProductRepository, ProductRepository>();
}

3.5 编写Controller和View

3.5.1 添加ProductController

image

image

image

3.5.2 添加View

在Index()方法处,右键选择Add View,弹出如下的对话框。在Template中选择List,Model class选择Product。

image

Index Action对应的Index View如下:

image

3.5.3 使用IProductRepository

private IProductRepository _repository;
public ProductController(IProductRepository repository)
{
    _repository = repository;
}
//
// GET: /Product/
public ActionResult Index()
{
    var products = _repository.GetAll();
    return View(products);
}

3.5.4 运行程序

image

以上的示例截图和代码已经展示了CURD中的R(Read),Create、Update、Delete的代码我就不再这里浪费篇章讲述了。

4. 总结

在本示例中开发人员只需要关注对象的Register和业务逻辑的编写,而不需要关注对象是如何Resolve和Dispose的。
如今MVC和Unity已经实现了非常好的集成,让开发人员并不用深入了的解MVC和Unity的运行机制就能开发出一个像样的Web应用程序。
这种方式在开发上可以节约很多时间,但是作为一个资深开发人员或者系统架构师,熟悉这个过程的实现原理还是必要的。

源码下载:Download