【发布时间】:2010-06-03 21:15:10
【问题描述】:
我一直在尝试一些用于 n 层数据访问的新模式,并且遇到了一种看起来非常灵活且易于实现的模式。基本上,我需要一个可以使各种数据层即时可插拔/可交换的解决方案——即,从数据库访问基础数据、分布式缓存、本地缓存等。
下面的代码很容易重复使用并且非常高效 - 只比我之前的完全硬编码的解决方案长了几个滴答声。
这看起来怎么样?有什么办法可以更好地实施吗?有什么一般的想法或批评吗?那些使用过类似模式的人有什么意见吗?
基类:
public class DataAdapterFactory<T> where T : class
{
private DataAdapter<T> Adapter;
public DataAdapterFactory(DataAdapterBase<T> Base)
{
Adapter = Base;
}
public void Extend<U>() where U : DataAdapterExtender<T>, T, new()
{
DataAdapterExtender<T> Extender = new U();
Extender.BaseAdapter = Adapter as T;
Adapter = Extender;
}
public T GetAdapter()
{
return Adapter as T;
}
}
public class DataAdapter<T> where T : class { }
public class DataAdapterBase<T> : DataAdapter<T> where T : class { }
public class DataAdapterExtender<T> : DataAdapter<T> where T : class
{
public T BaseAdapter;
}
在 DAL 中实施:
// base interface defines methods
public interface IMyDataAdapter
{
string GetString();
}
// base sql adapter
public class SqlDataAdapter : DataAdapterBase<IMyDataAdapter>, IMyDataAdapter
{
public string GetString()
{
return "SQL";
}
}
// provides cache support
public class DistributedCacheExtender : DataAdapterExtender<IMyDataAdapter>, IMyDataAdapter
{
public string GetString()
{
return BaseAdapter.GetString() + ", Distributed Cache";
}
}
// provides local cache support
public class LocalCacheExtender : DataAdapterExtender<IMyDataAdapter>, IMyDataAdapter
{
public string GetString()
{
return BaseAdapter.GetString() + ", Local Cache";
}
}
访问数据:
public IMyDataAdapter GetAdapter()
{
// create adapter based on SqlDataAdapter
DataAdapterFactory<IMyDataAdapter> factory = new DataAdapterFactory<IMyDataAdapter>(new SqlDataAdapter());
// implement distributed cache
factory.Extend<DistributedCacheExtender>();
// implement local cache
factory.Extend<LocalCacheExtender>();
return factory.GetAdapter();
}
使用上面的工厂,任何基本适配器和扩展器的组合(必须按执行顺序调用Extend())都可以通过接口轻松无缝地使用,而业务层一无所知实施。
在上面的这种情况下,调用 GetString() 将导致“SQL,分布式缓存,本地缓存”。在现实世界的场景中,将首先调用本地缓存。如果某个项目不存在,我们将前往分布式缓存,如果它不存在,我们将从数据库中获取它 - 任何模块都可以根据需要根据需要换入或换出、用户等。
【问题讨论】:
标签: c# design-patterns generics architecture