点击这里给我发消息 点击这里给我发消息

.NET框架设计—常被忽视的C#设计技巧

添加时间:2013-12-6
    相关阅读: 设计 软件 开发 技术 框架 C# 优化
 

阅读目录:

  • 1.开篇介绍
  • 2.尽量使用Lambda匿名函数调用代替反射调用(走进声明式设计)
  • 3.被忽视的特性(Attribute)设计方式
  • 4.扩展方法让你的对象如虎添翼(要学会使用扩展方法的设计思想)
  • 5.别怕Static属性(很多人都怕Static在Service模式下的设计,其实要学会使用线程本地存储(ThreadStatic))
  • 6.泛型的协变与逆变(设计架构接口(Interface)时要时刻注意对象的协变、逆变)
  • 7.使用泛型的类型推断(还在为参数类型烦恼吗)
  • 8.链式编程(设计符合大脑思维习惯的处理流程)
    • 8.1.链式编程(多条件(方法碎片化)调用
  • 9.部分类、部分方法的使用(扩大设计范围)

1.】开篇介绍

本文中的内容都是我无意中发现觉得有必要分享一下的设计经验,没有什么高深的技术,只是平时我们可能会忽视的一些设计技巧;为什么有这种想法是因为之前跟一些同事交流技术的时候会发现很多设计思维被固化了,比如之前我在做客户端框架开发的时候会去设计一些关于Validator、DTO Transfer等常用的Common function,但是发现在讨论某一些技术实现的时候会被弄的云里雾里的,会自我郁闷半天,不会及时的明白对方在说的问题;

后来发现他们一是没有把概念分清楚,比如.NETFrameworkC#VisualStudio,这三者之间的关系;二是没有理解.NET中各个对象的本质含义,比如这里的特性(Attribute),大部分人都认为它是被用来作为代码说明、标识使用的,而没有突破这个思维限制,所以在设计一些东西的时候会绕很多弯路;还有一点是很多人对C#中的语法特性分不清版本,当然我们要大概的了解一下哪些特性或者语法是C#2的哪些是C#3的,这样在我们设计东西的时候不会由于项目的版本问题而导致你无法使用设计技巧,比如扩展方法就无法使用在低于.NET3.0版本中,LINQ也无法在低于.NET3.O的版本中使用;

.NETFramework的版本不断的在升级,目前差不多5.0都快面世了;.NETFramework的升级跟C#的升级没有必然的关系,这个要搞清楚;C#是为了更好的与.NET平台交互,它提供给我们的都是语法糖,最后都是.NETCTS中的类型;就比如大家都在写着LINQ,其实到最后LINQ也就被自动解析成对方法的直接调用;

2.】尽量使用委托调用代替反射调用

委托相信大家都玩的很熟,委托的发展到目前为止是相当不错的,从原本很繁琐的每次使用委托的时候都需要定义一个相应的方法用来实例化委托,这点在后来的C#2中得到了改进,支持匿名委托delegate{…}的方式使用,再到现在的C#3那就更方便了,直接使用面向函数式的Lambda表达式;那么这样还需要反射调用对象的方法吗?(当然特殊场合我们这里不考虑,只考虑常用的场景;)当然反射不是不好,只是反射需要考虑很多性能优化方面的东西,增加了代码的复杂性,也让框架变的很重(现在都是在追求轻量级,只有在DomainModel中需要将平面化的数据抽象;),所以何不使用简单方便的委托调用呢;

注:如果你是初学者,这里的委托可以理解成是我们平时常用的Lambda表达式,也可以将它与Expression<T>结合起来使用,Expression<T>是委托在运行时的数据结构,而非代码执行路径;(兴趣的朋友可以查看本人的:LINQ系列文章)

下面我们来看一下演示代码:

 1 /*==============================================================================
 2  * Author:深度训练
 3  * Create time: 2013-07-28
 4  * Blog Address:http://www.cnblogs.com/wangiqngpei557/
 5  * Author Description:特定领域软件工程实践;
 6  *==============================================================================*/
 7 using System;
 8 using System.Collections.Generic;
 9 using System.Linq.Expressions;
10 using System.Linq;
11 using Infrastructure.Common.Cache;
12 using Infrastructure.Common.Validator;
13 
14 namespace ConsoleApplication1.DomainModel
15 {
16     /// <summary>
17     /// Order.
18     /// </summary>
19     [EntityCache(10, true)]
20     [EntityValidator(ValidatorOperationType.All)]
21     public class Order
22     {
23         /// <summary>
24         /// Order code.
25         /// </summary>
26         public string OrderCode { get; set; }
27 
28         /// <summary>
29         /// Items filed.
30         /// </summary>
31         private List<Item> items = new List<Item>();
32         /// <summary>
33         /// Gets items .
34         /// </summary>
35         public IEnumerable<Item> Items { get { return items; } }
36 
37         /// <summary>
38         /// Submit order date.
39         /// </summary>
40         public DateTime SubmitDate { get; set; }
41 
42         /// <summary>
43         /// Mark <see cref="DomainModel.Order"/> Instance.
44         /// </summary>
45         /// <param name="orderCode">Order code. </param>
46         public Order(string orderCode)
47         {
48             this.OrderCode = orderCode;
49         }
50 
51         /// <summary>
52         /// Sum items prices.
53         /// </summary>
54         /// <param name="itemUsingType">item type.</param>
55         /// <returns>prices .</returns>
56         public double SumPrices(int itemUsingType)
57         {
58             double resultPrices = 0.00;
59             var currentItems = items.GroupBy(item => item.ItemUsingType).Single(group => group.Key == itemUsingType);
60             if (currentItems.Count() > 0)
61             {
62                 foreach (var item in currentItems)
63                 {
64                     resultPrices += item.Price;
65                 }
66             }
67             return resultPrices;
68         }
69 
70         /// <summary>
71         /// Add item to order.
72         /// </summary>
73         /// <param name="item">Item.</param>
74         /// <returns>bool.</returns>
75         public bool AddItem(Item item)
76         {
77             if (!item.ItemCode.Equals(string.Empty))
78             {
79                 this.items.Add(item);
80                 return true;
81             }
82             return false;
83         }
84     }
85 }
咨询热线:020-85648757 85648755 85648616 0755-27912581 客服:020-85648756 0755-27912581 业务传真:020-32579052
广州市网景网络科技有限公司 Copyright◎2003-2008 Veelink.com. All Rights Reserved.
广州商务地址:广东省广州市黄埔大道中203号(海景园区)海景花园C栋501室
= 深圳商务地址:深圳市宝源路华丰宝源大厦606
研发中心:广东广州市天河软件园海景园区 粤ICP备05103322号 工商注册