[英]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.