我使用的使用工作模式爲單位的存儲庫:統一:多PerResolveLifetimeManager註冊類型的注射
public BaseRepository(IUnitOfWork unitOfWork, IEntityFactory factory) { ... }
以前我只曾經需要一個IUnitOfWork實例注入到倉庫(使用Unity),如如下圖所示:
// Unit of work for the UserDbContext
container.RegisterType<IUnitOfWork, EntityFrameworkUnitOfWork>(new PerResolveLifetimeManager(), new InjectionConstructor(new UserDbContext()));
container.RegisterType<IUserRepository, UserRepository>();
container.RegisterType<ITokenRepository, TokenRepository>();
現在我需要引入另一個倉庫,但這倉庫需要使用IUnitOfWork
的不同實例:
// Unit of work for the OrderDbContext
container.RegisterType<IUnitOfWork, EntityFrameworkUnitOfWork>(new PerResolveLifetimeManager(), new InjectionConstructor(new OrderDbContext()));
container.RegisterType<IOrderRepository, OrderRepository>();
如何使用Unity來明確指定哪個IUnitOfWork被注入到哪個存儲庫?
編輯:
使用丹尼爾JG的回答,我有以下代碼:
container.RegisterType<IUnitOfWork, EntityFrameworkUnitOfWork>(new PerResolveLifetimeManager(), new InjectionConstructor(new UserDbContext()));
container.RegisterType<IUnitOfWork, EntityFrameworkUnitOfWork>("OrderDbContext", new PerResolveLifetimeManager(), new InjectionConstructor(new OrderDbContext()));
container.RegisterType<IUserRepository, UserRepository>();
container.RegisterType<ITokenRepository, TokenRepository>();
container.RegisterType<IOrderRepository, OrderRepository>(
new InjectionConstructor(
new ResolvedParameter<IUnitOfWork>("OrderDbContext"),
new ResolvedParameter<IEntityFactory<Order, int, OrderTbl>>()
)
);
但以下異常被拋出:
[ResolutionFailedException:分辨率的依賴失敗,輸入 =「WebTest.Controllers.TestController」,name =「(none)」。發生異常時:解析時。例外是: InvalidOperationException - 類型IUnitOfWork沒有可訪問的構造函數。
UserRepository具體實施:
public class UserRepository : EntityFrameworkRepository<User, UserTbl>, IUserRepository
{
public UserRepository(IUnitOfWork unitOfWork, IEntityFactory<User, UserTbl> factory)
: base(unitOfWork, factory)
{ }
}
我也註冊了實體工廠。即:
container.RegisterType<IEntityFactory<User, int, UserTbl>, UserFactory>();
EntityFrameworkUnitOfWork構造:
public class EntityFrameworkUnitOfWork : IUnitOfWork
{
public EntityFrameworkUnitOfWork(DbContext context)
{
Context = context;
}
...
}
你可以發佈'UserRepository'的構造函數嗎? –
問題更新 – davenewza
剛編輯我的答案。在使用'InjectionConstructor'註冊類型時,您需要考慮Unity將使用的構造函數中的其他依賴項。這很麻煩,對重構不友好,所以我會留下一個'IUnitOfWork'作爲默認註冊(例如User和Token存儲庫),併爲其他存儲庫使用一個命名註冊和'InjectionConstructor'(在那個例如OrderRepository) –