WCF 中使用Unity.WCF

近期有个项目,使用的是WCF+Silverlight,所以自己先学习WCF基础,这里做一个简单的记录。

解决方案

搭建的基本系统框架如截图,Data部分是用的EF链接数据库,domain本来想使用域服务类,因为他会根据ORM产生的表生成增删改查功能,后来还是改为WCF,下面的两个是是使用了Telerik Silverlight搭建的页面,只包含简单的菜单和一个查询显示到GridView的操作,后面补一个争对telerik:RadGridView的学习篇。

项目结构

WCF中引入Unity.WCF

首先在Survery.Domain中添加一个名为SurveryService的WCF,会自动生成两个文件:ISurveryService.cs 和SurveryService.cs, 协议部分: [ServiceContract],[OperationContract]等都在ISurveryService.cs中,SurveryService.cs 中直接实现Interface即可。我们在WCF 中添加一个简单的查询方法:

public IEnumerable GetSurveryList()
        {
            SurveryDbEntities surveryDb = new SurveryDbEntities();
            try
            {
                return surveryDb.T_Survey.ToList().Select(s => new TSurvery()
                {
                    AcquittanceId = s.AcquittanceId,
                    BackName = s.BackName,
                    BankAccount = s.BankAccount,
                    Company = s.Company,
                    CreateTime = Convert.ToDateTime(s.CreateTime).ToString("yyyy-MM-dd"),
                    Email = s.Email,
                    PhoneNo = s.PhoneNo,
                    TaxId = s.TaxId,
                    UserName = s.UserName,
                    id = s.id
                });
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

TSurvery是业务需要自己添加的实体类,不做多解。
然后使用Nuget添加Unity.WCF。Unity.WCF其实也是继承Unity,针对WCF简化了使用方法,已经实现了ServiceHostFactory。其实也是需要RegisterType和Resolve。

添加Unity.wcf

具体使用方法:新增一个类命名为WcfServiceFactory,然后继承UnityServiceHostFactory,这时候需要去重写一个方法ConfigureContainer即可。具体代码如下:

    public class WcfServiceFactory:UnityServiceHostFactory
    {
        protected override void ConfigureContainer(Unity.IUnityContainer container)
        {
            container.RegisterType();
        }
    }

服务寄宿

在完成以上工作后,需要对服务进行寄宿,我们是寄宿在项目“tkSurveryApp.Web”中,参考微软文档:Hosting the Data Service,以往在ASP.NET中直接添加WCF,会生成一个.svc文件,在<%@ ServiceHost %> 中会有CodeBehind属性,绑定的是WCF代码的文件。但是我们项目使用的WCF是在另一个类中,并且使用了依赖注入,所以我们要使用另一个属性Factory,Factory是用于创建寄宿服务的ServiceHost 的ServiceHostFactory。我们会指定到WcfServiceFactory上。修改Service指向寄宿服务的类型。具体代码如下:

<%@ ServiceHost Language="C#" Debug="true" Service="Survery.Domain.SurveryService" Factory="Survery.Domain.WcfServiceFactory" %>

Silverlight中使用WCF

在Silverlight中添加WCF时遇到一个坑,当时很久都没解决,这个坑的截图如下


无法解析服务

提示无法导入,网上查找方法,最终解决方法是去掉图中那个勾,


去掉“重新使用引用的程序集中的类型”勾选

最后客户端调用代码:
        private void RadButton_Click(object sender, RoutedEventArgs e)
        {
            SurveryServiceClient client = new SurveryServiceClient();
            client.GetSurveryListAsync();
            client.GetSurveryListCompleted += client_GetSurveryListCompleted;
        }
        private void client_GetSurveryListCompleted(object sender, GetSurveryListCompletedEventArgs e)
        {
            rdData.ItemsSource = e.Result;
        }

网页运行结果


Silverlight 页面

你可能感兴趣的:(WCF 中使用Unity.WCF)