1

構造マップから Autofac に切り替えています。Scott Millett の本 ASP.net Design Patterns のキャッシング パターンを使用しました。これは、キャッシュとリポジトリの両方のインターフェイスを実装し、コンストラクターのパラメーター名に応じて適切なオブジェクトに切り替えます。

インターフェースはこんな感じ

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

あなたがどうするかを尋ねているのは、2 つのリポジトリ クラスの間にデコレータを設定することだと思います。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 に答える