核心库目前包含集合及管道过滤器,项目结构及命名空间参照了大名鼎鼎的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>
void Clear();
/// 出列
/// </summary>
/// <returns>结果</returns>
T Dequeue();
/// 入列
/// </summary>
/// <param name="item">项</param>
void Enqueue(T item);
/// 窥视
/// </summary>
/// <returns>结果</returns>
T Peek();
}
}
{
/// <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>
{
{
/// <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;
{
get
{
return this.queue.GetAllMessages().Length;
}
}
/// 前缀
/// </summary>
public string Prefix
{
get
{
return this.prefix;
}
set
{
this.prefix = value;
}
}
/// 构造函数
/// </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);
}
}
{
this.queue.Purge();
}
/// 转换
/// </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 this.Convert(this.queue.Receive());
}
{
if (this.queue != null)
{
this.queue.Dispose();
}
}
{
Message message = new Message();
message.Body = item;
message.Formatter = new XmlMessageFormatter(new[] { typeof(T) });
this.queue.Send(message);
}
{
return this.Convert(this.queue.Peek());
}
}
}
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();
}
}
{
T result = default(T);
this.TryDequeue(out result);
}
{
T result = default(T);
this.TryPeek(out result);
}
}
}
{
/// <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类图如下: