将缓存模式从Structuremap转换为AutoFac

时间:2012-11-20 10:29:18

标签: structuremap autofac

我正在从结构图切换到Autofac。我使用了Scott Millett的书ASP.net Design Patterns中的缓存模式,该模式实现了Cache和Repository的接口,并根据构造函数参数名称在相应的对象中进行切换

界面如下所示

public interface ISchemeRepository
{
        List<Scheme> GetSchemes();
}

缓存对象看起来像这样

public class SchemeRepository : BaseRepository, ISchemeRepository
{
/***************************************************************
 *  Properties
 ***************************************************************/

private readonly ISchemeRepository schemeRepository;

/***************************************************************
 *  Constructors
 ***************************************************************/
public SchemeRepository()
    : this(ObjectFactory.GetInstance<ISchemeRepository>(), ObjectFactory.GetInstance<IConfigurationSetting>())
{
}

public SchemeRepository(ISchemeRepository realSchemeRepository, IConfigurationSetting configurationSetting)
{
    schemeRepository = realSchemeRepository;
    this.configurationSetting = configurationSetting;
}

/**************************************************************
 *  Methods
 ***************************************************************/
public List<Scheme> GetSchemes()
{
    string key = Prefix + "Schemes";

    if (!MemoryCache.Default.Contains(key))
    {
        MemoryCache.Default.Add(key, schemeRepository.GetSchemes(), new CacheItemPolicy());
    }

    return (List<Scheme>)MemoryCache.Default.Get(key);
}

}

存储库看起来像这样

 public class SchemeRepository : BaseLocalRepository, ISchemeRepository
    {
        /***************************************************************
         *  Properties
         ***************************************************************/
        private readonly IConnectionSetting connectionSetting;

        /***************************************************************
         *  Constructors
         ***************************************************************/
        public SchemeRepository()
            : this(ObjectFactory.GetInstance<IConnectionSetting>())
        {
        }

        public SchemeRepository(IConnectionSetting connectionSetting)
        {
            this.connectionSetting = connectionSetting;
        }

        /**************************************************************
         *  Methods
         ***************************************************************/
        public List<Scheme> GetSchemes()
        {
            var response = new List<Scheme>();

            var conn = new SqlConnection(connectionSetting.CQBConnectionString);
            var command = new SqlCommand("proc_GetSchemes", conn) { CommandType = CommandType.StoredProcedure };

            conn.Open();
            var reader = command.ExecuteReader();
            while (reader.Read())
            {
                response.Add(
                        new Scheme
                        {
                            SchemeId = reader["Scheme_Id"].ToString().Trim(),
                            GuaranteeText = reader["Guarantee_Text"].ToString().Trim()
                        }
                    );
            }
            conn.Close();

            return response;         
        }


    }

结构地图调用在

之下
 InstanceOf<Repository.Local.Contract.IProviderRepository>().Is.OfConcreteType<Repository.Local.Core.ProviderRepository>().WithName("RealProviderRepository");

ForRequestedType<Repository.Local.Contract.IProviderRepository>().TheDefault.Is.OfConcreteType<Repository.Local.Cache.ProviderRepository>().CtorDependency<Repository.Local.Contract.IProviderRepository>().Is(x => x.TheInstanceNamed("RealProviderRepository"));

结构图查看构造函数,如果它包含一个名为“realSchemeRepository”的参数,则它实现连接到数据库的对象,否则它实现了检查缓存的缓存对象,如果没有任何内容则调用数据库缓存并填充缓存。

如何在Autofac中执行此操作?在Autofac中有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

我相信你要问的是在你的两个存储库类之间设置一个装饰器。我要假装两个类名是CacheSchemeRepository和RealSchemeRepository,因为命名它们完全相同是令人困惑和可怕的。反正...

builder.Register(c => new RealSchemeRepository(c.Resolve<IConnectionSetting>())
       .Named<ISchemeRepository>("real");

builder.RegisterDecorator<ISchemeRepository>(
    (c, inner) => new CacheSchemeRepository(inner, c.Resolve<IConfigurationSetting>()),
    "real");