现在的位置: 首页 > 综合 > 正文

.Net通用基础框架(.Net Common Infrastructure)-核心库

2011年07月04日 ⁄ 综合 ⁄ 共 4097字 ⁄ 字号 评论关闭

  核心库目前包含集合及管道过滤器,项目结构及命名空间参照了大名鼎鼎的Spring.Net,除了Spring.Net外,原则上不再引入其他第三方类库。

  • 集合
        提供一个泛型队列接口,契约如下:
namespace Common.Core.Collections.Generic
{
    
/// <summary>
    
/// 队列
    
/// </summary>
    
/// <typeparam name="T">类型</typeparam>
    public interface IQueue<T>
    {
        
/// <summary>
        
/// 数量
        
/// </summary>
        int Count
        {
            
get;
        }

        /// <summary>
        
/// 清空
        
/// </summary>
        void Clear();

        /// <summary>
        
/// 出列
        
/// </summary>
        
/// <returns>结果</returns>
        T Dequeue();

        /// <summary>
        
/// 入列
        
/// </summary>
        
/// <param name="item"></param>
        void Enqueue(T item);

        /// <summary>
        
/// 窥视
        
/// </summary>
        
/// <returns>结果</returns>
        T Peek();
    }
}

         内存队列实现如下:

using System.Collections.Generic;

namespace Common.Core.Collections.Generic
{
    
/// <summary>
    
/// 内存队列
    
/// </summary>
    
/// <typeparam name="T">类型</typeparam>
    public class MemoryQueue<T> : Queue<T>, IQueue<T>
    {

    }
}

         Msmq队列实现如下:

using System;
using System.Messaging;

namespace Common.Core.Collections.Generic
{
    
/// <summary>
    
/// Msmq队列
    
/// </summary>
    
/// <typeparam name="T">类型</typeparam>
    public class MsmqQueue<T> : IDisposable, IQueue<T>
    {
        
private string prefix = ".\\private$";
        
private MessageQueue queue;

        public int Count
        {
            
get
            {
                
return this.queue.GetAllMessages().Length;
            }
        }

        /// <summary>
        
/// 前缀
        
/// </summary>
        public string Prefix
        {
            
get
            {
                
return this.prefix;
            }
            
set
            {
                
this.prefix = value;
            }
        }

        /// <summary>
        
/// 构造函数
        
/// </summary>
        
/// <param name="name">名称</param>
        public MsmqQueue(string name)
        {
            
string fullname = string.Format("{0}\\{1}"this.Prefix, name);
            
if (!MessageQueue.Exists(fullname))
            {
                
this.queue = MessageQueue.Create(fullname);
            }
            
else
            {
                
this.queue = new MessageQueue(fullname);
            }
        }

        public void Clear()
        {
            
this.queue.Purge();
        }

        /// <summary>
        
/// 转换
        
/// </summary>
        
/// <param name="message">消息</param>
        
/// <returns>结果</returns>
        private T Convert(Message message)
        {
            T result 
= default(T);
            message.Formatter 
= new XmlMessageFormatter(new[] { typeof(T) });
            result 
= (T)message.Body;

            return result;
        }

        public T Dequeue()
        {
            
return this.Convert(this.queue.Receive());
        }

        public void Dispose()
        {
            
if (this.queue != null)
            {
                
this.queue.Dispose();
            }
        }

        public void Enqueue(T item)
        {
            Message message 
= new Message();
            message.Body 
= item;
            message.Formatter 
= new XmlMessageFormatter(new[] { typeof(T) });
            
this.queue.Send(message);
        }

        public T Peek()
        {
            
return this.Convert(this.queue.Peek());
        }
    }
}

         并发内存队列实现如下:

using System.Collections.Concurrent;

namespace Common.Core.Collections.Generic
{
    
/// <summary>
    
/// 并发内存队列
    
/// </summary>
    
/// <typeparam name="T">类型</typeparam>
    public class ConcurrentMemoryQueue<T> : ConcurrentQueue<T>, IQueue<T>
    {
        
public void Clear()
        {
            
while (!this.IsEmpty)
            {
                
this.Dequeue();
            }
        }

        public T Dequeue()
        {
            T result 
= default(T);
            
this.TryDequeue(out result);

            return result;
        }

        public T Peek()
        {
            T result 
= default(T);
            
this.TryPeek(out result);

            return result;
        }
    }
}

  • 管道过滤器

        管道过滤器模式不在常见的Gof23种设计模式之中,单独抽象出来放到核心库是因为应用场景很多,如Asp.net的请求管道,可以放置N多种过滤器(HttpModule),比较典型的实现有Forms验证Module,授权Module。

 

        管道过滤器Uml类图如下:

抱歉!评论已关闭.