使用Entity Framework和WCF Ria Services开发SilverLight之2:POCO

本文介绍如何通过使用PlainOldCLRObject(POCO)和分离数据访问层(DAL),实现Silverlight应用与Web服务之间的高效数据交互。通过将实体模型分离到独立项目中,利用POCO简化模型定义,同时创建专门的数据访问层项目,以DomainServiceSchool作为中间层,负责数据获取和业务逻辑处理。这种方式不仅提高了项目的可复用性和可维护性,还便于进行单元测试。文章最后提供了源码下载,帮助开发者实践这一改进架构。

在上一篇中《使用Entity Framework和WCF Ria Services开发SilverLight之1:简单模型》我们提出这类简单模型的几个问题:

1:实体模型被紧耦合在EDM中,同时它不能项目(模块)使用。随着每一次更新EDM,实体模型会被覆盖;

2:EDM和BLL紧耦合在一起;

3:没有提炼出数据接口,导致我们没有办法在此示例中进行单元测试。示例中虽然存在测试项目,但那是数据库相关的,达不到单元测试的要求;

1:创建POCO

本篇我们主要来解决第一个问题,那就是在EF中使用Plain Old CLR Object(简称POCO)。POCO是我们最熟悉不过实体模型。本示例所用的数据中Department的POCO形式为:

    public class Department
    {
        public int DepartmentID { get; set; }
        public string Name { get; set; }
        public decimal Budget { get; set; }
        public DateTime StartDate { get; set; }
        public int Administrator { get; set; }

        public List<Course> Courses { get; set; }

        public void AddCourse(Course course)
        {
            if (Courses == null)
            {
                Courses = new List<Course>();
            }

            if (!Courses.Contains(course))
            {
                Courses.Add(course);
            }

            course.Department = this;
        }
    }

如果不使用POCO,我们可以在EDM的后台代码中找到这个类的定义,它看上去增加了很多Attribute,并且复杂多了。

为了便于实体模型被更多的项目使用,我们为提升所有的实体模型到一个新创建的项目中,名为SchoolModel。

2:使用EF创建数据访问层

在本篇中,我们不打算再把数据访问耦合在WEB中,而是为其新建了一个项目,名为SchoolData。现在,我们已经创建了本篇所要展示的4个项目,如下:

image

接着,我们按照第一篇中步骤,在SchoolData中创建EDM。由于本文已经采用POCO,所以我们必须关闭EF自动为我们的EDM生成实体模型。要关闭代码生成,在Model.edmx上点属性,然后,清楚自定义工具中的内容。

image

关闭代码生成后,我们会发现EDM的后台文件消失了。

接着,手动创建SchoolContext,完成数据库操作。如下:

    public class SchoolContext : ObjectContext
    {
        static string conn = "metadata=res://*/ModelSchool.csdl|res://*/ModelSchool.ssdl|res://*/ModelSchool.msl;provider=System.Data.SqlClient;provider connection string=\"Data Source=hzh-pc\\sqlexpress;Initial Catalog=School;Persist Security Info=True;User ID=sa;Password=sasa\"";
        public SchoolContext()
            : base(conn, "SchoolEntities")
        {
            _courses = CreateObjectSet<Course>();
            _departments = CreateObjectSet<Department>();
        }

        private ObjectSet<Course> _courses;
        public ObjectSet<Course> Courses
        {
            get
            {
                return _courses;
            }
        }

        private ObjectSet<Department> _departments;
        public ObjectSet<Department> Departments
        {
            get
            {
                return _departments;
            }
        }

    }

(你应该修改conn,以满足你的开发设置)。到目前为止,我们知道,项目SchoolModel可以被任何其它项目使用,SchoolData也同样,它即可以被WEB引用作为RIA SERVICE公开给SL APP,也可以被类似Winform的项目使用,这很COOL,离我们的目标越来越近了。

3:创建Ria Service

本步骤,我们仍旧将DomainService创建在WEB中,名为DomainServiceSchool。

image

由于我们已经把数据访问层,也就是EF解耦出去了,所以我们无法和在第一篇中一样,在这里选择DataContext了。没有关系,确保选择“Enable client access”,点OK。

这个时候我们去查看DomainServiceSchool,由于它已经不直接从EF中获取数据(确切滴说,它也不应该知道数据访问层通过什么来获取数据),所以它的基类,已经从LinqToEntitiesDomainService<SchoolContext>变为DomainService。

4:DomainServiceSchool从数据访问层SchoolData获取数据

DomainService不会再直接从SchoolContext获取数据,也就是说,DAL需要负责公开自己的数据接口给DomainServiceSchool。比如,为了获取Department数据,我们需要在DAL中创建一个类型DepartmentRepository,由该类型负责向DomainServiceSchool公开数据接口。DepartmentRepository的实现如下:

    public class DepartmentRepository : IDepartmentRepository
    {
        SchoolContext _schoolContext;
        public DepartmentRepository()
        {
            _schoolContext = new SchoolContext();
        }
        public DepartmentRepository(SchoolContext schoolContext)
        {
            _schoolContext = schoolContext;
        }

        public Department GetDepartmentById(int id)
        {
            return _schoolContext.Departments.Where( d => d.DepartmentID == id).Single();
        }

        public IEnumerable<Department> GetAll()
        {
            return _schoolContext.Departments;
        }

        public void AddDepartment(Department department)
        {
            _schoolContext.Departments.AddObject(department);
        }
    }

接着,我们在DomainServiceSchool调用它,如下:

    [EnableClientAccess()]
    public class DomainServiceSchool : DomainService
    {

        public IEnumerable<Department> GetDepartments()
        {
            DepartmentRepository cr = new DepartmentRepository();
            return cr.GetAll();
        }

    }

5:小结

SL APP部分和第一篇一样,本篇不在赘述。

本篇源码下载:SilverlightApplication20110612.zip(要让程序可以运行,需要安装第一篇中的数据库)

通过以上的改造,我们的系统架构呈现这样的形式:

image

1:SchoolData(DAL),SchoolModel(Object Model),作为公共模块,可以提供给其它调用方;

2:Winform或者Web作为模块的消费者;

3:SilverLight通过Ria Services消费Web中的DomainService。

源码来自:https://pan.quark.cn/s/a3a3fbe70177 AppBrowser(Application属性查看器,不需要越狱! ! ! ) 不需要越狱,调用私有方法 --- 获取完整的已安装应用列表、打开删除应用操作、应用运行时相关信息的查看。 支持iOS10.X 注意 目前AppBrowser不支持iOS11应用查看, 由于iOS11目前还处在Beta版, 系统API还没有稳定下来。 等到Private Header更新了iOS11版本,我也会进行更新。 功能 [x] 已安装的应用列表 [x] 应用的详情界面 (打开应用,删除应用,应用的相关信息展示) [x] 应用运行时信息展示(LSApplicationProxy) [ ] 定制喜欢的字段,展示在应用详情界面 介绍 所有已安装应用列表(应用icon+应用名) 为了提供思路,这里只用伪代码,具体的私有代码调用请查看: 获取应用实例: 获取应用名应用的icon: 应用列表界面展示: 应用列表 应用运行时详情 打开应用: 卸载应用: 获取info.plist文件: 应用运行时详情界面展示: 应用运行时详情 右上角,从左往右第一个按钮用来打开应用;第二个按钮用来卸载这个应用 INFO按钮用来解析并显示出对应的LSApplicationProxy类 树形展示LSApplicationProxy类 通过算法,将LSApplicationProxy类,转换成了字典。 转换规则是:属性名为key,属性值为value,如果value是一个可解析的类(除了NSString,NSNumber...等等)或者是个数组或字典,则继续递归解析。 并且会找到superClass的属性并解析,superClass如...
基于遗传算法辅助异构改进的动态多群粒子群优化算法(GA-HIDMSPSO)的LSTM分类预测研究(Matlab代码实现)内容概要:本文研究了一种基于遗传算法辅助异构改进的动态多群粒子群优化算法(GA-HIDMSPSO),并将其应用于LSTM神经网络的分类预测中,通过Matlab代码实现。该方法结合遗传算法的全局搜索能力与改进的多群粒子群算法的局部优化特性,提升LSTM模型在分类任务中的性能表现,尤其适用于复杂非线性系统的预测问题。文中详细阐述了算法的设计思路、优化机制及在LSTM参数优化中的具体应用,并提供了可复现的Matlab代码,属于SCI级别研究成果的复现与拓展。; 适合人群:具备一定机器学习优化算法基础,熟悉Matlab编程,从事智能算法、时间序列预测或分类模型研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①提升LSTM在分类任务中的准确性与收敛速度;②研究混合智能优化算法(如GA与PSO结合)在神经网络超参数优化中的应用;③实现高精度分类预测模型,适用于电力系统故障诊断、电池健康状态识别等领域; 阅读建议:建议读者结合Matlab代码逐步调试运行,理解GA-HIDMSPSO算法的实现细节,重点关注种群划分、异构策略设计及与LSTM的集成方式,同时可扩展至其他深度学习模型的参数优化任务中进行对比实验。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值