在现代软件架构中,服务框架是实现服务间通信的关键组件。优化服务框架不仅可以提高应用程序的性能,还可以简化开发和维护过程。本文将探讨几种可以轻松实现的服务框架优化技术,这些技术可以作为服务框架和服务客户端的一部分。以下是本文讨论的重点:
本文并没有提出全新的概念,而是展示了如何使用C#列表对象来缓存服务和对象。这包括一个XML文件,该文件易于映射对象及其类型,以便在运行时使用工厂模式创建对象。
UML的高层设计图展示了本文解释的所有内容。相信还可以在这个项目中进行更多的优化,但目前只想介绍一些可以提高服务通信性能的领域。
在任何服务调用或任何调用到外部应用程序边界的过程中,最主要的耗时过程是初始化和打开通道。这就是需要连接池的地方。在WCF服务调用中,可以通过在客户端缓存服务通道来轻松实现。本文将向展示通道缓存和对象缓存以提高速度。
需要VS 2010来打开解决方案,但确信相同的代码在VS 2008中也可以工作,只要创建另一个VS 2008解决方案并添加这些文件。
如果查看以下图片,可以轻松理解包含的不同层和文件。可能可以下载附加的代码,并深入研究每个文件以了解更多关于实现的信息。
以下代码实现了客户端服务缓存。它还经过了多线程测试,因为多个线程将异步访问缓存集合对象。
public static I CreateInstance<I>() where I : class {
string endPointConfig = typeof(I).Name.ToString();
lock (_channels.SyncRoot) {
if (!_channels.ContainsKey(endPointConfig)) {
_channels.Add(endPointConfig, OpenChannel<I>());
} else if ((((IClientChannel)_channels[endPointConfig]).State == CommunicationState.Faulted) || (((IClientChannel)_channels[endPointConfig]).State == CommunicationState.Closed) || (((IClientChannel)_channels[endPointConfig]).State == CommunicationState.Closing)) {
// 如果通道出现故障,现有的通道将从缓存中移除,并重新创建通道。
((IClientChannel)_channels[endPointConfig]).Abort();
((IClientChannel)_channels[endPointConfig]).Close();
_channels.Remove(endPointConfig);
_channels.Add(endPointConfig, OpenChannel<I>());
}
return _channels[endPointConfig] as I;
}
}
这部分代码用于创建通道并打开通道。
private static I OpenChannel<I>() where I : class {
string endPointConfig = typeof(I).Name.ToString();
ChannelFactory<I> factory = new ChannelFactory<I>(endPointConfig);
factory.Open();
I channel = factory.CreateChannel();
((IClientChannel)channel).Faulted += new EventHandler(ServiceFactory_Faulted);
return channel;
}
这部分代码在服务出现故障时执行,同时需要从缓存集合中移除。
static void ServiceFactory_Faulted(object sender, EventArgs e) {
((ICommunicationObject)sender).Abort();
((ICommunicationObject)sender).Close();
Type typ = ((ICommunicationObject)sender).GetType();
lock (_channels.SyncRoot) {
((ICommunicationObject)sender).Faulted -= new EventHandler(ServiceFactory_Faulted);
_channels.Remove(typ.Name);
}
}
这部分代码实现了对象池化,并在服务主机中使用,当服务调用业务对象时。
public static I CreateInstance<I>() where I : class {
lock (_pooledObjects.SyncRoot) {
if (!_pooledObjects.ContainsKey(typeof(I))) {
_pooledObjects.Add(typeof(I), GetInstance<I>());
}
return _pooledObjects[typeof(I)] as I;
}
}
// return GetInstance<I>() as I;
这就是全部内容 - 非常简单。