日期:2014-05-19  浏览次数:20712 次

【【在实战应用中,我该选择哪种缓存解决方案。】】【100】
在项目中,为了提高系统的运行效率,我用到了缓存技术。下面是两种不同的写法,第一个是某大型项目中用的,另外一个是我现在准备用的。据说是第一个好,那么我不明白,它好在哪里?请指点。
public   interface   IDataProviderBase
{
          .....
}

public   class   SqlDataProvider   :   IDataProviderBase
{
          .....
}

assemblyPath   为   engine.dll的路径
className         为   engine项目中的一个类
cacheKey           为   cache键值


方法一:
if(cache不存在)
        cache.Insert
        (cacheKey,
        Assembly.LoadFrom(   assemblyPath).GetType(   className   ).GetConstructor(new   Type[0]),  
        new   CacheDependency(   assemblyPath   )   );  
else
        读取cache
  return   (IDataProviderBase)(     ((ConstructorInfo)cache[cacheKey]).Invoke(null)   );

方法二
if(cache不存在)
      IDataProviderBase   pr   =   new   Data.SqlDataProvider();
      cache.Insert(cacheKey,   pr   ,   new   CacheDependency(   assemblyPath   )   );  
else
        读取cache
return   (IDataProviderBase)(cache[cacheKey]);

------解决方案--------------------
光这样是看不出那个更好的。
我以前使用的,貌似第一个。
------解决方案--------------------
第一个使用反射灵活,你的效率比他的高,但是不够灵活。
------解决方案--------------------
if(cache不存在)
cache.Insert
(cacheKey,
Assembly.LoadFrom( assemblyPath).GetType( className ).GetConstructor(new Type[0]),
new CacheDependency( assemblyPath ) );
else
读取cache
return (IDataProviderBase)( ((ConstructorInfo)cache[cacheKey]).Invoke(null) );
---------------------------------------------
这个主要是 扩展性上考虑的,松耦合结构LoadFrom是加载程序集

而你的 只能做小型项目,
------解决方案--------------------

------解决方案--------------------
IDataProviderBase pr = new Data.SqlDataProvider();
这句话就决定了你的这个只适用于你自己。如果别的对象要用的话,你就得在new出来一个pr,这样做程序的可扩展性降低了,(也许这样做效率会高一些)第一种方法用了反射,这样模块独立性好,应为不牵扯到别的类。它和别的类或者模块的耦合度底了。把这个类或者模块拿到别的类或者模块中不用修改就可以使用了。
------解决方案--------------------
感觉是个工厂方法,不算缓存吧。
------解决方案--------------------
第一种灵活,但是效率不但好

第二种效率好,不灵活..

一般情况下都会选择第一种.
------解决方案--------------------
顶起来吧……
------解决方案--------------------
学习,帮顶一下。好深奥阿
------解决方案--------------------
这个主要是 扩展性上考虑的,松耦合结构LoadFrom是加载程序集
========================================================
能具体点吗?
----------------------
public interface IDataProviderBase
{
.....
}

public class SqlDataProvider : IDataProviderBase
{
.....
}

LoadFrom是加载程序集
现在假设我要缓存另外一个类
public class SqlDataProvider111 : IDataProviderBase
{
.....
}
你的程序需要改动...