named registration > , IUnitOfWork.
Unity ( ) , . , IUnitOfWork . :
container.RegisterType<IUnitOfWork, UnitOfWork>(new PerResolveLifetimeManager(),
new InjectionConstructor(new UserDbContext()));
container.RegisterType<IUnitOfWork, UnitOfWork>("OrderUow",
new PerResolveLifetimeManager(),
new InjectionConstructor(new OrderDbContext()));
, IUnitOfWork , container.Resolve<IUnitOfWork>, , UserDbContext. - container.Resolve<IUnitOfWork>("OrderUow"), , OrderDbContext. ( , , )
, IUnitOfWork. ResolvedParameter, . (. SO)
, :
container.RegisterType<IUserRepository, UserRepository>();
container.RegisterType<ITokenRepository, TokenRepository>();
container.RegisterType<IOrderRepository, OrderRepository>(new InjectionConstructor(
new ResolvedParameter<IUnitOfWork>("OrderUow"),
//additional dependencies in the OrderRepository constructor, resolved using default Unity registrations
new ResolvedParameter<IEntityFactory<Order,OrderTbl>>()));
, OrderRepository , Unity , IUnitOfWork , .
, :
public FooClass(IOrderRepository orderRepository, IUserRepository userRepository, ITokenRepository tokenRepository)
{
...
}
userRepository tokenRepository IUnitOfWork, UserDbContext.
orderRepository IUnitOfWork, OrderDbContext.
Edit
new InjectionConstructor , . IUnitOfWork IEntityFactory<T1, T2> . IOrderRepository , IEntityFactory<Order,OrderTbl> ( UserRepository, IEntityFactory<User, UserTbl>).
ResolvedParameter<T> typeOf(T). , InjectionConstructor , .
,
public UserRepository(IUnitOfWork unitOfWork, IEntityFactory<User, UserTbl> factory)
: base(unitOfWork, factory)
{ }
InjectionConstructor :
container.RegisterType<IUserRepository, UserRepository>(new InjectionConstructor(
new ResolvedParameter<IUnitOfWork>("UserUow"),
new ResolvedParameter<IEntityFactory<User,UserTbl>>()));
container.RegisterType<IUserRepository, UserRepository>(new InjectionConstructor(
new ResolvedParameter<IUnitOfWork>("UserUow"),
typeof(<IEntityFactory<User,UserTbl>>)));
, UnitOfWork , InjectionConstructor , UnitOfWork .
2 -
:
public class DbContext
{
public string Name { get; set; }
}
public interface IUnitOfWork
{
DbContext DbContext { get; }
}
public class UnitOfWork : IUnitOfWork
{
private readonly DbContext _dbContext;
public UnitOfWork(DbContext dbContext)
{
_dbContext = dbContext;
}
public DbContext DbContext { get { return _dbContext; } }
}
public interface IOrderRepository
{
IUnitOfWork UnitOfWork { get;}
}
public class BaseRepository
{
private readonly IUnitOfWork _uow;
public BaseRepository(IUnitOfWork uow)
{
_uow = uow;
}
public IUnitOfWork UnitOfWork { get { return _uow; } }
}
public class OrderRepository : BaseRepository, IOrderRepository
{
private IFooAdditionalDependency _foo;
public OrderRepository(IUnitOfWork uow, IFooAdditionalDependency foo)
: base(uow)
{
_foo = foo;
}
}
public interface IFooAdditionalDependency { }
public class FooAdditionalDependency : IFooAdditionalDependency
{
}
public interface IUserRepository
{
IUnitOfWork UnitOfWork { get; }
}
public class UserRepository : BaseRepository, IUserRepository
{
public UserRepository(IUnitOfWork uow)
: base(uow)
{
}
}
public interface ITokenRepository
{
IUnitOfWork UnitOfWork { get; }
}
public class TokenRepository : BaseRepository, ITokenRepository
{
public TokenRepository(IUnitOfWork uow)
: base(uow)
{
}
}
Unity :
container.RegisterType<IUnitOfWork, UnitOfWork>(new PerResolveLifetimeManager(),
new InjectionConstructor(new DbContext{Name = "UserDB"}));
container.RegisterType<IUnitOfWork, UnitOfWork>("OrderDbContext",
new PerResolveLifetimeManager(),
new InjectionConstructor(new DbContext { Name = "OrderDB" }));
container.RegisterType<IUserRepository, UserRepository>();
container.RegisterType<ITokenRepository, TokenRepository>();
container.RegisterType<IOrderRepository, OrderRepository>(new InjectionConstructor(
new ResolvedParameter<IUnitOfWork>("OrderDbContext"),
typeof(IFooAdditionalDependency)));
container.RegisterType<IFooAdditionalDependency, FooAdditionalDependency>();
-, :
public class HomeController : Controller
{
public HomeController(IOrderRepository orderRepository, IUserRepository userRepository, ITokenRepository tokenRepository)
{
Debug.WriteLine("Order repository context: {0}, User repository context:{1}", orderRepository.UnitOfWork.DbContext.Name, userRepository.UnitOfWork.DbContext.Name);
Debug.WriteLine("Order repository context: {0}, User repository context:{1}", orderRepository.UnitOfWork.DbContext.GetType().Name, userRepository.UnitOfWork.DbContext.GetType().Name);
Debug.Assert(orderRepository.UnitOfWork != userRepository.UnitOfWork);
Debug.Assert(userRepository.UnitOfWork == tokenRepository.UnitOfWork);
}
public ActionResult Index()
{
return View();
}
}