随笔分类 - .NET/C#
有关.NET/C#的技术文章
摘要:在有些情况下,我们希望界面上的Action Link不仅仅是限制未授权用户的进一步访问,而是对于这些用户直接隐藏。比如,以普通用户登录时,只能在页面上看到一些常规的链接,而以管理员身份登录时,除了能看到这些常规链接外,还能够看到网站管理的链接。本文将介绍如何使用自定义的AuthorizeAttribute来实现这样的功能。为了方便介绍,在这里不打算使用那些复杂的权限管理子系统或者权限验证机制,我们就做一个非常简单的假设:如果输入的用户名是“daxnet”,则表示这个账户是一个管理员账户,否则,它就是一个普通用户账户。在实际应用过程中,读者朋友可以采用自己的一套权限验证逻辑来判断某个账户是否为管
阅读全文
摘要:ASP.NET MVC是一款基于ASP.NET的MVC模式的实现框架。通过使用ASP.NET MVC框架,开发人员能够非常方便地完成应用程序前台页面的开发工作。优秀的前台展示,对于大型企业级应用而言,是非常重要的组成部分,而ASP.NET MVC则为实现这一重要组成部分提供了技术和平台支持。目前,ASP.NET MVC已经到了4.0 Beta的版本,但我仍然打算以ASP.NET MVC 3为基础,通过几篇文章的篇幅,介绍一些ASP.NET MVC的实用技术,比如:如何实现自定义的认证机制、如何实现多主题效果的支持等。这些内容在网上也或多或少地提供了一些解决方案,但有些也不算太完整,有些又写的很
阅读全文
摘要:在以前的Apworks框架中,Apworks的核心组件(Apworks.dll)定义了所有与仓储/仓储上下文相关的接口,而在另外的程序集中,实现了这些接口并提供了针对某个ORM框架的仓储/仓储上下文的具体实现。当然,目前我也只是开发了针对NHibernate的仓储实现,也就是那个Apworks.Repositories.NHibernate程序集。这样做的目的,就是为了使得Apworks的核心组件能够脱离具体的第三方组件而独立存在,避免由于第三方组件存在的缺陷而导致核心组件需要频繁更新。这种做法参考了Martin Fowler在其PoEAA一书中描述的Separated Interface模式
阅读全文
摘要:.NET 4.0中的Task Parallel Library(TPL)已经不是什么新鲜事了,相信很多朋友也阅读过不少有关TPL的书籍资料。而另一方面,能够将TPL合理地运用在实际项目开发过程中,以提高程序的执行效率,这种情况也并不多见。本文就以实际项目中的一个程序功能为例,简要讨论一下TPL的应用。在此我不打算对TPL的相关基础知识做过多讨论,这些内容在网上应该有不少的文章资料可供参考;同时读者朋友还可以阅读一些有关TPL的经典书籍,以便加深对TPL的理解。文章最后我会推荐几本不错的有关.NET 4.0下TPL的书籍资料。案例:批量对象的XML序列化在某个项目中,需要对一大批相同类型的对象进
阅读全文
摘要:前文回顾:在Visual Studio 2010中创建多项目(解决方案)模板【一】:多项目解决方案模板的创建在Visual Studio 2010中创建多项目(解决方案)模板【二】:Template Wizard的使用本文主要讨论多项目(解决方案)模板的部署相关问题,包括:为多项目解决方案模板设置模板名称修改多项目解决方案模板的图标创建Visual Studio 2010扩展的安装包VSIX文件为多项目解决方案模板设置模板名称模板名称的设置非常简单,,只需要修改CMSProjectTemplate.vstemplate文件中的Name XML节点的内容即可。例如,我们可以为我们的模板起名为:C
阅读全文
摘要:在上文中我给大家介绍了多项目解决方案模板的创建,在文章的最后我们遇到了一个问题,就是$safeprojectname$这个模板参数(宏)所指代的意义在各个项目中都不一样,而我们却希望它能够简单地指代用户所输入的项目名称。本文将从这个问题出发,讨论在Visual Studio 2010中是如何使用Template Wizard来设计复杂的多项目解决方案的。Template Wizard的基本应用创建Template Wizard项目在CMSProjectTemplate解决方案下,新建一个C# Class Library,取名为CMSProjectTemplateWizard,在该项目上添加Mi
阅读全文
摘要:当我们使用Visual Studio来新建某个项目(Project)时,通常都会使用File –> New –> Project菜单来打开New Project(新建项目)对话框,里面列出了各种项目类型以供我们选择。大部分读者朋友都应该知道,这个对话框其实是列出了所有已经安装的项目模板,不仅如此,Visual Studio还允许用户通过File –> Export Template菜单将现有的项目导出为项目模板。平时我们最为常见的是使用Export Template来创建单一项目的项目模板,此时使用Export Template功能就十分有效。当然,社区里也有一些工具(比如微
阅读全文
摘要:在进行框架开发的过程中,我们往往需要对配置文件的结构进行设计,以便产生一套完整的配置方案,供开发人员在使用框架时能对框架进行配置。对于某些大型的框架,其配置节点的结构可能相当复杂,比如某个配置节点(Configuration Element)可以有属性,还可以在其下挂载多个其它的配置节点或者多个配置节点集合(Configuration Element Collection)。如果使用手动编写代码的...
阅读全文
摘要:原本不打算写这篇的,因为之前基本上每篇文章都有总结部分,因此,在系列文章结束的时候,需要总结的内容并不多;但正如刚刚所说,经过几个月的努力,本系列文章也到了该结尾的时候,于是还是做个简要的总结吧。我们从《项目简介与环境搭建》开始,了解了NLayerApp的项目概况、先决条件、运行环境以及部署方式,并对该项目所立足的理论基础做了一个非常简单的介绍;接下来的《多层架构与应用系统设计原则》、《DDD、分布式DDD及其分层》两篇文章从理论的角度对软件架构设计原则、分层架构、领域驱动设计、面向领域的多层分布式系统等方面进行了较为详细的介绍;《基础结构层(Cross-Cutting部分)》、《基础结构层(
阅读全文
摘要:Microsoft NLayerApp采用基于WCF的分布式服务组件为外界(各种类型的GUI)提供了访问接口,客户端程序只需要添加Service引用即可使用NLayerApp应用程序所提供的功能。在NLayerApp中,分布式服务部分的设计与结构还是比较简单的,主要包括DistributedServices.Core、DistributedServices.MainModule以及DistributedServices.Deployment三个项目。DistributedServices.Core该项目为所有位于分布式服务层的组件提供公共的类型定义与功能实现,比如在这个项目中定义了与异常处理相
阅读全文
摘要:NLayerApp中,在领域模型层之上是应用层与分布式服务(Distributed Services)部分。应用层主要负责接收来自客户端的请求数据,然后协调领域模型层与基础结构层组件完成语义上相对独立的任务;而分布式服务部分则为应用层与客户端之间提供通讯的接口和技术架构,严格地说它已经不具备任何任务处理的责任了,在整个应用程序中是一个可有可无的角色:对于ASP.NET Web应用程序而言,它只需要引用应用层组件的接口,然后通过IoC获得应用层组件实体即可,无需分布式服务的支持。当然,如果还需要考虑与其它系统的集成的话,那么实现一个分布式服务还是很有必要的。今天我们先讨论NLayerApp中的应
阅读全文
摘要:我估计从博客园建站开始,就不断地有文章对设计模式进行讨论了。设计模式被认为是软件工程的基础,是面向对象分析与设计的指南。博客园中不乏大量的优秀文章,针对设计模式中创建型模式、结构型模式以及行为型模式共计23种模式进行讨论,有的文章也自成体系,以不同的角度来分析各种模式的应用场景和动态特性。今天,我也在所有设计模式专家面前班门弄斧一次,冒着被喷的危险,谈谈Decorator模式的具体应用。与大多数其...
阅读全文
摘要:本文将重点介绍Microsoft NLayerApp的领域模型层,这涉及到Domain.Core、Domain.Core.Entities、Domain.MainModule以及Domain.MainModule.Entities四个项目。Domain.Core项目包含了基本接口的定义以及规约模式(Specification Pattern)的实现;Domain.Core.Entities则包含了支持Entity Framework的STE(Self-Tracking Entity)的实现代码,在上文《Microsoft NLayerApp案例理论与实践 - 基础结构层(数据访问部分)》我对S
阅读全文
摘要:上篇文章讲解了NLayerApp案例的基础结构层(Cross-Cutting部分),现在,让我们继续解读NLayerApp的基础结构层(数据访问部分)。NLayerApp的基础结构层(数据访问部分)包含如下内容:Unit Of Work(PoEAA)、仓储的具体实现、NLayerApp的数据模型以及与测试相关的类。下面,我们将对前三个部分进行讨论,与测试相关的内容,我打算最后单独一章进行介绍。Unit Of Work(PoEAA)Unit Of Work(UoW)模式在企业应用架构中被广泛使用,它能够将Domain Model中对象状态的变化收集起来,并在适当的时候在同一数据库连接和事务处理上
阅读全文
摘要:从这篇文章开始,我将逐步介绍NLayerApp的基础结构层、领域层、应用层以及分布式服务层。本文着重介绍基础结构层,根据上文对NLayerApp的架构分析,它将包含两大部分的内容:处理数据访问的基础结构层组件和Cross-Cutting的基础结构层组件。处理数据访问的基础结构层组件主要包含了仓储的具体实现、Unit Of Work(PoEAA,Martin Fowler)的实现、NLayerApp的实体模型定义,以及为单体测试做准备的Service Stubs(PoEAA,Martin Fowler);Cross-Cutting的基础结构层组件则主要包含了IoC(Inversion of Co
阅读全文
摘要:从Visual Studio 2010开始,有一个Modeling Project的项目模板,允许应用程序设计人员通过该项目完成统一的UML模型设计。与Visual Studio 2008 DSLTools相比,通过Modeling Project创建出来的UML模型对象,能够被使用到各个不同的UML视图中,这一功能是由UML Model Explorer维护的。我们可以看到,相同的UML模型对象...
阅读全文
摘要:.NET直接提供对MSMQ的访问支持,只需要添加System.Messaging程序集引用即可方便地操作MSMQ。MSMQ支持两种事务处理模式:内部事务处理以及基于MS-DTC的分布式事务处理。MSMQ的内部事务处理MSMQ的内部事务处理是指,仅采用MSMQ本身提供的事务处理机制完成事务处理。比如,假设有一系列的消息需要发布到MSMQ,那么,就可以启动一个内部事务,确保这些消息的发布过程是一个原子操作。要使用MSMQ的内部事务处理机制,在创建消息队列的时候,就需要勾选“事务性”选项,如下图所示:首先,需要创建一个MessageQueueTransaction的对象,并使用Begin调用以启动M
阅读全文
摘要:在继续实现Apworks框架的过程中,发现一个必须解决的问题,就是分布式事务处理。它要求两个原本相对独立的工作能够在同一个事务上下文中完成处理。如果处理成功,则两者同时提交,否则,两者同时回滚。Apworks框架需要依赖分布式事务来解决二次提交(2PC)的问题,这个在我之前的博客文章中也提到过,简单地说,就是领域事件的存储和发布必须是一个原子操作。在此,我打算使用2-3篇文章的篇幅对.NET下分布式事务处理的实现做个简单的总结,其中并不会涉及到有关分布式事务的原理/理论方面的内容,仅仅是对其实现方式做个记录。首先需要了解到,虽然.NET分布式事务在一定程度上能够解决Apworks框架中2PC的
阅读全文
摘要:在对NLayerApp实际项目进行讨论之前,让我们首先学习一下(或者应该说重温一下)分层/多层架构与应用系统设计原则。很多朋友会认为这些都是老掉牙的内容,只要是软件从业人员,都会对这些内容非常熟悉。然而,果真如此吗?我在这里整理这部分内容,一方面是为介绍NLayerApp打下基础,而另一方面,则是希望借此机会将这些理论性的东西做个归纳,也希望读者朋友能够认真阅读,毕竟温故知新嘛。 需要说明的是,从本章节开始,大多数理论性的东西都源自Microsoft Spain团队针对NLayerApp所编写的《Architecture Guide Book》,事实上这本Guideline的英文版至今也还没有
阅读全文
摘要:项目简介Microsoft – Spain团队有一个很不错的“面向领域多层分布式项目”案例:Microsoft – Domain Oriented N-Layered .NET 4.0 App Sample(在本系列文章中,我使用NLayerApp作为该项目的名称进行介绍),在codeplex上的地址是:http://microsoftnlayerapp.codeplex.com/。它是学习领域驱动设计(DDD)的一个非常不错的案例项目。该项目采用的是经典的DDD架构,而不是CQRS架构,但我觉得整个案例做的非常不错,基本上包含了基于DDD的架构实践的各个方面。因此,应不少社区朋友的要求,我打
阅读全文