我正在ASP.NET MVC中做一个项目,我想在其中实现一个IoC容器。我是IoC容器的新手,一直在寻找解决问题的方法,但到目前为止无济于事。
问题是dat数据分布在各种数据库中。用户登录后,将从授权数据库中检索用户的数据库,然后在用户会话中进行设置。该用户会话在构造时会传递给服务和存储库,因此他们可以在需要它时访问数据库。
典型的裸剥离服务(没有接口和ioc)如下所示:
private CompetitionRepository _CompetitionRepo;
public CompetitionService(DataContext dataContext)
: this (new CompetitionRepository(dataContext))
{ }
public CompetitionService(CompetitionRepository competitionRepo)
{
this._CompetitionRepo = competitionRepo;
}
“DataContext”包含一些属性,使用这些属性为会话选择正确的数据库。由于服务和存储库无权访问会话本身(超出其范围),因此需要此对象。
我的问题是,如何在IoC中设置这样的东西(无论哪个容器,我只是想知道一般的想法)。据我所知,大多数容器不允许传入对象?或者设计是否存在根本缺陷?
答案 0 :(得分:2)
据我所知,大多数容器 不允许传入对象?
你看不出远;)我知道的大多数IoC容器都有能力做到这一点。您需要根据其类型注册对象的实例。如何以及何时构建该对象可能比您提出的问题更深层次。但是,为了达到这一点,您可以使用Unity容器执行类似的操作:
DataContext context = ..... ;
container.RegisterInstance(context);
每次创建需要DataContext的类的实例时,您将获得已注册的实例。如果要与实例关联的类型不同,则可以强制它:
container.RegisterInstance<IDataContext>(context);
有关详细信息,请选择look here。