我一直在玩一些新的n层数据访问模式,并且遇到了一个看起来非常灵活且易于实现的模式。基本上,我需要一种解决方案,可以使各种数据层即时可插拔/ swapabale - 即从基本数据访问数据库,分布式缓存,本地缓存等。通用多层数据访问模式?
下面的代码很容易重复使用,效率非常高比我以前完全硬编码的解决方案延长了几个钟头。
这是怎么回事?有什么办法可以更好地实施?任何一般的想法或批评?来自使用类似模式的人的任何输入?
基类:
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,分布式缓存,本地缓存”。在现实世界中,本地缓存将首先被调用。如果某个项目不在那里,我们将转到分布式缓存,如果它不在那里,我们会从DB获取 - 根据需要,可以根据需要交换任何模块,用户等
绝对是一个选项。最初导致我离开的原因是,当你实现一个新的“装饰器”时,需要编写构造器,但我可能只是在挑剔...... – Andrew 2010-06-03 22:02:53
这种方法更偏向于继承的组合,并且在使用依赖注入的情况下工作得很好。 – 2010-06-04 05:09:14