1

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

界面看起来像这样

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

缓存对象如下所示

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

私有只读 ISchemeRepository 方案存储库;

/***************************************************************
 *  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 中有没有更好的方法来做到这一点?

4

1 回答 1

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");
于 2012-11-20T20:50:59.173 回答