StructureMap+EF+Linq搭建MVC框架

开发工具准备
1、安装数据库
1

2、安装VS

2

切记先安装SQL Server 在安装visual studio,否则后果不堪设想。

3、安装mvc插件
3

安装完插件需要重启vs才能生效,至此,已具备开发mvc工程的能力。

几个基本概念

1、LINQ是什么
LINQ,语言集成查询(Language Integrated Query)是一组用于c#和Visual Basic语言的扩展。它允许编写C#或者Visual Basic代码以查询数据库相同的方式操作内存数据。

2、LINQ to Entities
LINQ to Entities 是LINQ技术在实体对象模型中的一种实现,它与LINQ to SQL以及LINQ to DataSets一起构成了LINQ to ADO.Net。提供了丰富的类似SQL的查询语法,并且与SQL的功能基本是一一对应的。

3、实体框架Entity Framework(简称EF)
3-1、EF与ADO.NET关系
ADO.NET Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) 解决方案,早期被称为 ObjectSpace,最新版本是EF7【CodeOnly功能得到了更好的支持】

实体框架Entity Framework 是 ADO.NET 中的一组支持开发面向数据的软件应用程序的技术。是微软的一个ORM框架。

3-2、什么是O/R Mapping
广义上,ORM指的是面向对象的对象模型和关系型数据库的数据结构之间的相互转换。
狭义上,ORM可以被认为是,基于关系型数据库的数据存储,实现一个虚拟的面向对象的数据访问接口。理想情况下,基于这样一个面向对象的接口,持久化一个OO对象应该不需要要了解任何关系型数据库存储数据的实现细节

3-3、ORM in EF
Entity Framework 利用了抽象化数据结构的方式,将每个数据库对象都转换成应用程序对象 (entity),而数据字段都转换为属性 (property),关系则转换为结合属性 (association),让数据库的 E/R 模型完全的转成对象模型,如此让程序设计师能用最熟悉的编程语言来调用访问。而在抽象化的结构之下,则是高度集成与对应结构的概念层、对应层和储存层,以 及支持 Entity Framework 的数据提供者 (provider),让数据访问的工作得以顺利与完整的进行。

  (1) 概念层:负责向上的对象与属性显露与访问。

  (2) 对应层:将上方的概念层和底下的储存层的数据结构对应在一起。

  (3) 储存层:依不同数据库与数据结构,而显露出实体的数据结构体,和 Provider 一起,负责实际对数据库的访问和 SQL 的产生

4、StructureMap是什么
是一款很不错的IOC/DI工具,也就是依赖注入。

快速入门
step
1、建库建表
4

数据库名字为XHCommunityService;表名称StreetBasicInformation

2、构建mvc工程

5

3、添加一个类库YMSXH.Entity
3-1、右击解决方法,选择添加新项目

6-0

3-2、新建实体数据模型XHCommunityService.edmx

7

会自动产生一个配置文件App.Config,用来配置与数据库的链接信息

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <connectionStrings>
    <add name="XHCommunityServiceEntities" connectionString="metadata=res://*/XHCommunityService.csdl|res://*/XHCommunityService.ssdl|res://*/XHCommunityService.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=.;Initial Catalog=XHCommunityService;User ID=sa;Password=123456;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>
</configuration>

这就是EF(Entity FrameWork)的核心——edmx文件。至此已经把我们刚创建的整个数据库成功映射进来了。

4、新建一个类库YMSXH.Interface
4-1、在该类库下添加一个接口
4-1-1、引用相关dll

16

除了红色标记外,其它的没有自动的导入,有击引用即可。

4-1-2、代码如下:

namespace YMSXH.Interface
{
    public interface IStreet
    {
        List<YMSXH.Entity.StreetBasicInformation> GetStreetAll();
    }
}

定义了一个返回街道列表的方法,这个类库作为我们项目的接口层。

5、新建一个类库YMSXH.Implement
5-1、再该类库下添加一个接口层的实现类

5-1-1、引用相关dll

13

除了红色标记外,其它的没有自动的导入,有击引用即可。

5-1-2、代码如下:

namespace YMSXH.Implement
{
    public class IMPStreet : IStreet
    {
        XHCommunityServiceEntities db = ObjectFactory.GetInstance(typeof(XHCommunityServiceEntities)) as XHCommunityServiceEntities;

        public List<YMSXH.Entity.StreetBasicInformation> GetStreetAll()
        {

            var list = from p in db.StreetBasicInformation select p;
            return list.ToList();
        }
    }
}

通过StructureMap获取到数据库对象

XHCommunityServiceEntities db = ObjectFactory.GetInstance(typeof(XHCommunityServiceEntities)) as XHCommunityServiceEntities;

使用Linq操作数据库相关表

 var list = from p in db.StreetBasicInformation select p;
 return list.ToList();

该类库作为项目的实现层。

6、新建一个类库YMSXH.Service
6-1、在该类库下添加一个业务处理类
6-1-1、引用相关dll
15

除了红色标记外,其它的没有自动的导入,有击引用即可。

6-1-2、代码如下:

namespace YMSXH.Service
{
    public class StreetService
    {
        private  readonly IStreet Istreet;
        public StreetService(IStreet istreet)
        {
            this.Istreet = istreet;

        }

        public List<YMSXH.Entity.StreetBasicInformation> GetStreetAll()
        {

            return Istreet.GetStreetAll();
        }

    }
}

看见没,该类中只维护了接口。该类库作为项目的业务层。

7、新建一个类库YMSXH.Core
7-1、引用相关dll

7

StructureMap.dll需要去下载之后引用进来,其它三个是刚上面创建的几个类库。

7-2、创建几个StructureMap相关的几个核心类

9

7-2-1、StructureMapIoc类代码如下:

namespace YMSXH.Core.Ioc
{
    public class StructureMapIoc
    {
        public static object Get(Type t)
        {
            return ObjectFactory.GetInstance(t);
        }
        public static T Get<T>()
        {
            return ObjectFactory.GetInstance<T>();

        }
    }
}

7-2-2、StructureMapControllerFactory类代码如下:


namespace YMSXH.Core.Ioc
{
    public class StructureMapControllerFactory : DefaultControllerFactory
    {
        protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
        {
            if (controllerType == null) return null;
            return StructureMapIoc.Get(controllerType) as IController;
        }

    }
}

7-2-3、DatabaseRegistry类代码如下:

namespace YMSXH.Core.Ioc
{
    public class DatabaseRegistry : Registry
    {
        public DatabaseRegistry()
        {
            For<YMSXH.Interface.IStreet>().Use<YMSXH.Implement.IMPStreet>();
        }

    }
}

该类的职责是接口和实现类的绑定,这样一来可以轻松更换实现类实现不同的业务处理,达到解耦的目的。

7-2-4、StructureMapRegistration类代码如下:


namespace YMSXH.Core.Ioc
{
    public class StructureMapRegistration
    {
        public static void RegisterAll()
        {
            ObjectFactory.Initialize(x =>
            {
                x.AddRegistry<DatabaseRegistry>();
                x.For<XHCommunityServiceEntities>().HttpContextScoped().Use(() => new XHCommunityServiceEntities());
            });
        }
    }
}

8、创建控制器StreetController


namespace StructureMapMVCTest.Controllers
{
    public class StreetController : Controller
    {
       // private IStreet Istreet;
        private readonly StreetService Service;
        public StreetController(StreetService service)
        {
            this.Service = service;
        }
        //
        // GET: /Street/

        public ActionResult Index()
        {

            List<YMSXH.Entity.StreetBasicInformation> list = Service.GetStreetAll();
            ViewData["StreetBasicInformation"] = list;
            return View();
        }

    }
}

9、创建控制器对应的视图Index.cshtml

@model YMSXH.Entity.StreetBasicInformation
@{
    ViewBag.Title = "添加街道受理量";
}

<!DOCTYPE html>
<html>
   <head>
    <title>addOrder</title>

</head>
<body>
    @using (Html.BeginForm("addOrder", "CwSearch", new { id = "" }, FormMethod.Post, new { name = "orderform", id = "orderform" }))
    {

        <div class="bg">
            <div id="addexam_div">

                <div class="content">
                    <table>
                        <tr>
                            <td class="tdleft">
                                街道列表:
                            </td>
                            <td class="tdright">
                                <select name="jiedao" id="jiedao">
                                    <option value="全部">--全部--</option>
                                    @{
                           if (ViewData["StreetBasicInformation"] != null)
                           {
                               IList<YMSXH.Entity.StreetBasicInformation> list = (IList<YMSXH.Entity.StreetBasicInformation>)ViewData["StreetBasicInformation"];
                               foreach (var m in list)
                               {
                                        <option value="@m.XHCode">@m.AbbreviationName</option>

                               }

                           }  }
                                </select>
                            </td>
                        </tr>

                    </table>
                </div>

            </div>
        </div>
    }

    <div></div>
</body>
</html>

10、Web.config配置如下

<?xml version="1.0"?>
<!--
  For more information on how to configure your ASP.NET application, please visit
  http://go.microsoft.com/fwlink/?LinkId=152368
  -->

<configuration>

  <connectionStrings>

    <add name="XHCommunityServiceEntities" connectionString="metadata=res://*/XHCommunityService.csdl|res://*/XHCommunityService.ssdl|res://*/XHCommunityService.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=.;Initial Catalog=XHCommunityService;User ID=sa;Password=123456;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />
    <!--<add name="bizEntities" connectionString="metadata=res://*/BizEntities.csdl|res://*/BizEntities.ssdl|res://*/BizEntities.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=61.147.67.36;initial catalog=biz;persist security info=True;user id=sa;password=kfb@2013123,abc;multipleactiveresultsets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />-->
  </connectionStrings>
  <appSettings>
    <add key="ClientValidationEnabled" value="true"/> 
    <add key="UnobtrusiveJavaScriptEnabled" value="true"/> 
  </appSettings>

  <system.web>
    <compilation debug="true" targetFramework="4.0">
      <assemblies>
        <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      </assemblies>
    </compilation>

    <authentication mode="Forms">
      <forms loginUrl="~/Account/LogOn" timeout="2880" />
    </authentication>

    <pages>
      <namespaces>
        <add namespace="System.Web.Helpers" />
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Routing" />
        <add namespace="System.Web.WebPages"/>
      </namespaces>
    </pages>
  </system.web>

  <system.webServer>
    <validation validateIntegratedModeConfiguration="false"/>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>

  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="3.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

11、Global.asax代码如下:

namespace StructureMapMVCTest
{
    // Note: For instructions on enabling IIS6 or IIS7 classic mode, 
    // visit http://go.microsoft.com/?LinkId=9394801

    public class MvcApplication : System.Web.HttpApplication
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorAttribute());
        }

        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                "Default", // Route name
                "{controller}/{action}/{id}", // URL with parameters
                new { controller = "Street", action = "Index", id = UrlParameter.Optional } // Parameter defaults
            );

        }

        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            RegisterGlobalFilters(GlobalFilters.Filters);
            RegisterRoutes(RouteTable.Routes);

            StructureMapRegistration.RegisterAll();
            ControllerBuilder.Current.SetControllerFactory(new StructureMapControllerFactory());
        }
    }
}

全局初始化操作类,把路由器配置和DI初始化置于此。

12、运行项目

11

10

13、整体项目结构

12

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值