澳门新浦京娱乐场网站-www.146.net-新浦京娱乐场官网
做最好的网站

澳门新浦京娱乐场网站:WCF快速搭建Demo,用法总

autofac官网:

这里的unity指的是完成依赖注入的unity而不是游戏引擎。

一、开发环境

1、开发环境: Visual Studio 2013

2、数据库:Sql Server 2012

3、代码管理:TFS(微软免费提供的)

说明:VS2013与vs2012感觉变化不大,我下载的是Pro版,数据库为vs2013自带的的sqlserver数据库。代码管理使用的是微软免费提供的tfs(现在叫Visual Studio Online了,免费版包括5个用户,无限制团队项目和私有代码存储库,对个人来说足够用了),我是经常外地,使用别的电脑,使用tfs的目的一是代码共享;二是做个备份。

WCF快速搭建Demo

ps:本Demo只是演示如何快速建立WCF

今天自己搭了一套基于三层的依赖注入mvc web api 的依赖注入框架,在此总结下相关配置

原本项目完成依赖注入用的是spring.net,但是spring.net已经很久没人维护了,所以微软官方推出的Unity成为了替代spring.net的最佳候选之一。

二、使用的技术

澳门新浦京娱乐场网站 1

前4项为创建项目的默认添加的,对Easyui这个是否使用我一直没想好,有时候觉得作为网站项目,非管理软件能不用还是尽可能不用吧。

说下mvc5吧,看介绍mvc5跟MVC4变化不大。

1、One ASP.NET。这个是asp.net的新特性,不应是MVC的,大致意思是可以把Web Forms,MVC,Web API等糅合在一个项目中,mvc中可以添加webforms的东西,可以添加api,其他项目也如此。

2、ASP.NET Identity。全新的会员身分系统(membership),一个是基于OWIN,另一个是使用Entity Framework Code First來管理,可以自己扩展用户字段等。

3、Bootstrap。做界面的好咚咚。可惜我不懂,正好这次学习一下。

1.首先完成IBLL、BLL、Model层的搭建,由于数据访问层不是重点,WCF搭建才是主要内容,所以本Demo略去数据访问层。

新建BLL类库项目,添加UserInfo类如下:

 

 1 namespace Model
 2 {
 3     [DataContract]
 4     public class UserInfo
 5     {
 6         [DataMember]
 7         public int Id { get; set; }
 8         [DataMember]
 9         public string Name { get; set; }
10     }
11 }

 

当实体对象作为网络传输时需要被序列化,所以注意以下几点:

  1.不给任何标记将会做XML映射,所有公有属性/字段都会被序列化

  2.[Serializable]标记会将所有可读写字段序列化

  3.[DataContract]和[DataMember]联合使用来标记被序列化的字段

接下来,新建IBLL类库项目,添加IUserInfoService类作为接口契约,代码如下:

1 namespace IBLL
2 {
3     [ServiceContract]
4     public interface IUserInfoService
5     {
6         [OperationContract]
7         UserInfo GetUser(int id);
8     }
9 }

ps:需要操作的方法一定要记得打上标签!

同样,新建BLL类库项目,添加UserInfoService类,代码如下(只为测试WCF搭建):

 1 namespace BLL
 2 {
 3     public class UserInfoService:IUserInfoService
 4     {
 5         public UserInfo GetUser(int id)
 6         {
 7             return new UserInfo() { Id = id, Name = "test" };
 8         }
 9     }
10 }

 

1.设置应用程序的.net Framework版本为 4.5

autofac作为一个热门ioc框架,还是有了解一下的必要的。这里用两个小案例来简单说说autofac在.net framework控制台应用程序和asp.net mvc5 项目中的使用。

简单控制台demo:

三、项目结构

 

澳门新浦京娱乐场网站 2

 

  •  Web项目:与用户进行交互的MVC项目。MVC中的试图和控制器部分,并适当定义视图与控制器间进行交互的试图模型(以ViewModel为后缀)。包含两个区域Member(用户区域),Manage(管理区域)。
  • Models项目:模型类,一般是与数据库或项目之间交互数据的的类(不包括试图模型)。
  • Common项目:放置一些公共方法,像加密,转换,生成验证码等。
  • IDAL项目:数据访问层接口,定义通过EF与数据库进行操作方法。
  • DAL项目:数据访问层,继承自IDAL并实现其定义的方法。
  • IBLL项目:业务逻辑层接口,定义通过调用数据访问层并进行处理为Web项目提供服务的方法。
  • BLL项目:业务逻辑层,继承自IBLL并实现其定义的方法。

2.搭建WCFHost(宿主)

新建一个控制台项目,在配置文件app.config中的configuration节点下添加:

<system.serviceModel>
    <services>
      <service name="BLL.UserInfoService" behaviorConfiguration="behaviorConfiguration">
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8000/"/>
          </baseAddresses>
        </host>
        <endpoint address="" binding="basicHttpBinding" contract="IBLL.IUserInfoService"></endpoint>
      </service>
    </services>

    <behaviors>
      <serviceBehaviors>
        <behavior name="behaviorConfiguration">
          <serviceMetadata httpGetEnabled="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

注意以下几点:

  1.因为是本地测试,所以baseAddress填写了本地的地址,这个可以根据实际修改。

   2.service节点的name属性要修改为BLL层具体服务类的“命名空间 类名”。

  3.endpoint节点的contract属性要修改为IBLL层具体服务类接口的“命名空间 接口名”。

主程序代码中添加:

1 using (ServiceHost host = new ServiceHost(typeof(UserInfoService)))
2             {
3                 host.Open();
4                 Console.WriteLine("服务已启动,按任意键中止...");
5                 Console.ReadKey();
6                 host.Close();
7             }

ps:typeof()中换成要调用的服务类。

在项目上右键选择“在文件资源管理器中打开文件夹”,找到可执行程序WCFService.exe,右键选择“以管理员身份运行”。

 

2.通过Nuget 安装autofac包

先从控制台应用程序开始。

 

一、基本框架

还是先说下基本框架吧,一下子搞了7个项目看着挺乱的,我的理解是M、V、C 3者中,M是数据载体,V是用户要看的试图,C主要是协调控制与用户界面相关的操作,而数据的处理,数据库的的操作交给DAL、BLL来做。整个思路就是:View是用户看到的界面;Controller负责协调用户操作的东西,需要或处理数据时找业务逻辑层;业务逻辑层需要访问数据库时又找数据访问层;数据访问层通过EF与Sql Server进行交互;各层之间数据交互的媒介就是Model。

这里IBLL和IDAL是接口,功能都在BLL和DAL中实现了,看似有些多余,其实还是很有用处。一个是接口只实现方法定义看起来一目了然;另一个是只要接口不变,不管实现的代码怎么写项目间的调用都不会变。

澳门新浦京娱乐场网站 3

3.最后一步,就是来测试我们的WCF服务是否搭建成功了,新建一个winform窗体项目WCFClient,在项目右键,添加服务引用,在地址栏输入    (配置文件中填写的baseAddress)。在该程序中调用刚刚搭建好的WCF服务:

1 UserInfoServiceClient client = new UserInfoServiceClient();
2 UserInfo u =  client.GetUser(5);
3 MessageBox.Show(u.Id   "-"   u.Name);

运行后,弹出消息,表示WCF服务搭建成功!

 

Install-Package Autofac

首先nuget安装autofac,新建IDemo接口

首先新建控制台应用,nuget搜索unity并安装。

二、项目建立

1、建立Web项目。

选择 模板->Visual C#->Web->ASP.NET Web应用程序。

这里与vs2012中有一个显著地变化,webform、mvc 、api等做的一个模板中了。如图

澳门新浦京娱乐场网站 4

如果想像以前一样开发怎么办? 点开web-> Visual Studio 2012 是不是熟悉的感觉又回来了。

澳门新浦京娱乐场网站 5

我们这里还是选择Web->ASP.NET Web应用程序 确定。

澳门新浦京娱乐场网站 6

这里选择MVC(可以选择添加webform、api的引用,把以前的几种项目杂烩到一起。这里只选MVC),身份验证选个人用户账户,这样会添加最新的ASP.NET Identity的使用代码(其实选什么无所谓,这里不打算使用ASP.NET Identity,用户管理还是自己来做,选上它是想看看微软的代码是怎么写的)。

2、建立其他6个项目

在解决方案上点右键->添加->新建项目

项目类型选择->Visual C# –>Windows->类库。

澳门新浦京娱乐场网站 7

以此建立其他六个项目。

完工后框架如下:

澳门新浦京娱乐场网站 8

Install-Package Autofac.WebApi

namespace AutuFacDemo
{
    interface IDemo
    {
        string Hello();
    }
}
using System;  
using Unity;
using Unity.Attributes;

namespace ConsoleApp1
{
    public class Index
    {

        [Dependency]
        public virtual IUserService UserService { set; get; }

        public static void Main(string[] args)
        {
            var container = new UnityContainer();
            container.RegisterType<IUserService, UserService>();           //注册
            IUserService userService = container.Resolve<IUserService>();  //获取
            userService.Hello();
        }
    }

    public interface IUserService
    {
        void Hello();
    }

    class UserService : IUserService
    {
        public void Hello()
        {
            Console.WriteLine("hello");
        }
    }
}

三、项目之间的引用

项目建立好之后要添加项目间的引用。

在web项目的引用上点右键,选择解决方案->项目 添加Ninesky.Models、 Ninesky.Common、 Ninesky.IBLL、 Ninesky.BLL的引用

依次:IDAL添加Ninesky.Models引用

DAL添加Ninesky.Modles、 Ninesky.IDAL引用

IBLL添加Ninesky.Modles引用

BLL添加Ninesky.Models、 Ninesky.IDAL、 Ninesky.DAL、 Ninesky.IBLL引用

另外DAL Models要在Nuget上添加 EntityFramework的引用。方法是项目引用上点右键选择管理NUGET程序包。在弹出窗口中选 联机->nuget.org->EntityFramework  然后点安装就可自动完成安装。

澳门新浦京娱乐场网站 9

3.引用如下命名空间

新建Demo类实现IDemo接口:

 

四、总结

到此框架算是搭完了。这里web项目代表了mvc中的v和c。modle项目代表了m。common项目准备写公共方法。其他4个项目算是三层架构中的间数据数据访问层和业务逻辑层,另外还是用了面向接口。下次终于可以写代码了。

using Autofac;
using Autofac.Integration.WebApi;
using Autofac.Integration.Mvc;
using System.Web.Mvc;
namespace AutuFacDemo
{
    public class Demo :IDemo
    {
        public string Hello()
        {
            return "hello";
        }
    }
}

在asp.net mvc里使用unity:

4.再按照如下代码配置Autofac(分别搭建DAL、BLL、IDAL、IBLL)

Program.cs:

澳门新浦京娱乐场网站:WCF快速搭建Demo,用法总结。1、新建asp.net mvc应用,nuget安装unity.mvc

public static void Register()
{
澳门新浦京娱乐场网站:WCF快速搭建Demo,用法总结。var builder = new ContainerBuilder();
HttpConfiguration configuration = GlobalConfiguration.Configuration;
var assemblyList = AppDomain.CurrentDomain.GetAssemblies();

using Autofac;
using System;

namespace AutuFacDemo
{
    class Program
    {
        private static IContainer Container { set; get; }

        static void Main(string[] args)
        {
            var builder = new ContainerBuilder();
            builder.RegisterType<Demo>().As<IDemo>();
            Container = builder.Build();

            using (var scope = Container.BeginLifetimeScope())
            {
                var demo = scope.Resolve<IDemo>();
                Console.WriteLine(demo.Hello());
                Console.ReadKey();
            }
        }
    }
}

2、新建类库BLL、IBLL,完成后目录如下:

builder.RegisterWebApiFilterProvider(configuration);

这样就完成了一个最简单的控制台Demo。

澳门新浦京娱乐场网站 10

//var iServices = Assembly.Load("IOC.IBLL");
//var services = Assembly.Load("IOC.BLL");
//var iRepository = Assembly.Load("IOC.IDAL");
//var repository = Assembly.Load("IOC.DAL");

 

3、BLL新建UserService,IBLL新建IUserService,实现Hello方法

//builder.RegisterAssemblyTypes(iServices, services)
// .Where(t => t.Name.EndsWith("Service"))
// .AsImplementedInterfaces();

现在开始使用mvc5案例。

namespace IBLL
{
    public interface IUserService
    {
        string Hello();
    }

}

using IBLL;

namespace BLL
{
    public class UserService:IUserService
    {
        public string Hello()
        {
            return "hello";
        }
    }
}

//var test = builder.RegisterAssemblyTypes(iRepository, repository)
// .Where(t => t.Name.EndsWith("Dal"))
// .AsImplementedInterfaces();

nuget安装Autofac.Mvc5

4:在Global.asax.cs里填写配置。示例如下:

builder.RegisterAssemblyTypes(assemblyList)
.Where(t => t.Name.EndsWith("Service") || t.Name.EndsWith("Dal"))
.AsImplementedInterfaces();

同一解决方案内新建IBLL和BLL类库,IBLL存放IDemo.cs:

using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
using BLL;
using IBLL;
using Unity;
using Unity.AspNet.Mvc;

namespace WebApp
{
    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);

            var container = BuildUnityContainer();        //自定义BuildUnityContainer方法,获取容器
            DependencyResolver.SetResolver(new UnityDependencyResolver(container));

        }

        IUnityContainer BuildUnityContainer()
        {
            UnityContainer container = new UnityContainer();
            container.RegisterType<IUserService, UserService>();return container;
        }
    }
}

builder.RegisterControllers(Assembly.GetExecutingAssembly()).PropertiesAutowired(); //注册所有controller
builder.RegisterApiControllers(Assembly.GetExecutingAssembly()).PropertiesAutowired(); //注册所有apicontroller

namespace IBLL
{
    public interface IDemo
    {
        string Hello();
    }
}

 

var container = builder.Build();

BLL存放Demo.cs

5、在Control中获得UserService类并使用

configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container);//注册api容器
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));//注册mvc容器
}

using IBLL;

namespace BLL
{
    public class Demo :IDemo
    {
        public string Hello()
        {
            return "hello";
        }
    }
}
using System.Web.Mvc;
using IBLL;

namespace WebApp.Controllers
{
    public class HomeController : Controller
    {
        private IUserService UserService;public HomeController(IUserService userService)
        {
            this.UserService = userService;   //使用构造函数注入
        }

        public ActionResult Index()
        {
            string str = UserService.Hello();
            return Content(str);
        }

    }
}

5.在Application_Start里调用 AutofacConfig.Register();

Global.asax.cs配置autofac:

这样就完成了一个最简单的mvc demo。

6.然后在每一层采用构造函数依赖注入方式。

using Autofac;
using Autofac.Integration.Mvc;
using BLL;
using IBLL;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;

namespace WebDemo
{
    public class WebApiApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            GlobalConfiguration.Configure(WebApiConfig.Register);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);


            var builder = new ContainerBuilder();
            builder.RegisterControllers(typeof(WebApiApplication).Assembly);

            builder.RegisterType<Demo>().As<IDemo>();

            var container = builder.Build();
            DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
        }
    }
}

 

 

控制器配置Demo方法:

别的如使用配置文件、使用其他方法注入等详细操作,可以参考这篇博文:

using IBLL;
using System.Web.Mvc;

namespace WebDemo.Controllers
{
    public class HomeController : Controller
    {

        private IDemo _demo;

        public HomeController(IDemo demo)
        {
            this._demo = demo;
        }

        public ActionResult Index()
        {
            ViewBag.Title = "Home Page";

            return View();
        }

        public ActionResult Demo()
        {
            string hello = _demo.Hello();
            return Content(hello);
        }
    }
}

unity官方文档:

运行后访问Demo方法,即可看到效果。

 

 

本文由澳门新浦京娱乐场网站发布于www.146.net,转载请注明出处:澳门新浦京娱乐场网站:WCF快速搭建Demo,用法总