簡體   English   中英

使用Lambda表達式和AutoFac中的參數注冊通用類型

[英]Register Generic Type using lambda expression with a parameter in AutoFac

我試圖做這個 ,但是有一個通用類,如:

public class BaseRepository<TEntity> : IBaseRepository<TEntity>, IDisposable
    where TEntity : class, new()
    {
        public BaseRepository(IIndex<ContextKey, IDbContextBase> factory, ContextKey key)
        {
            Context = factory[key];
            Set = Context.Set<TEntity>();
        }
}

這樣我就可以將ContextKey鍵作為參數傳遞。

我正在嘗試根據已將什么密鑰傳遞給BaseRepository<>類的ctor來動態解析dbcontext。

像這樣注冊

builder.Register((c, p) =>
                 new BaseRepository<>(p.Named<ContextKey>("key")))
       .As<IBaseRepository<>>();

解析如下:

var reader = scope.Resolve<IBaseRepository<ActionEntity>>(
new NamedParameter("key", ContextKey.Applications));

傳遞的密鑰為:

public enum ContextKey
{
    Pure, Phoebus, Applications, Legacy, None
}

並將factory參數內置到Autofac中-它是由Autofac自動注入和處理的。

具有IIndex<ContextKey, IDbContextBase> factory, ContextKey key存儲庫構造函數中的IIndex<ContextKey, IDbContextBase> factory, ContextKey key看起來很像實現方面的問題,可以委托給組合根。

首先,我將簡化存儲庫的構造函數以遵循顯式依賴原則。

public class BaseRepository<TEntity> : IBaseRepository<TEntity>, IDisposable
    where TEntity : class, new() {

    //...

    public BaseRepository(IDbContextBase context) {
        Context = context;
        Set = Context.Set<TEntity>();
    }

    //...
}

然后,“合成根目錄”將負責確保正確構建存儲庫。

ContextKey key = //known value

//...Assumes IIndex<ContextKey, IDbContextBase> factory is registered

builder
    .RegisterGeneric(typeof(BaseRepository<>))
    .As(typeof(IBaseRepository<>))
    .WithParameter(
        new ResolvedParameter(
            (pi, ctx) => pi.ParameterType == typeof(IDbContextBase) && pi.Name == "context",
            (pi, ctx) => {
                var factory = ctx.Resolve<IIndex<ContextKey, IDbContextBase>>();
                return factory[key];
            })
    );

//...

var container = builder.Build();

注意,使用ResolvedParameter動態獲取要注入到存儲庫中的參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM