我有一个类似于以下的类:
public class CarAttributes
{
private readonly ICarRepository _carRepository;
private readonly int _carId;
public CarAttributes(ICarRepository carRepository, int carId)
{
_carRepository = carRepository;
_carId = carId;
}
public bool IsRegistered
{
get
{
return _carRepository.IsRegistered(_carId);
}
}
public bool IsStolen
{
get
{
return _carRepository.IsStolen(_carId);
}
}
}
我也有以下方法(在语法上不正确)
public CarAttributes GetCarAttributes(int carId)
{
return new CarAttributes(carId);
}
我正在使用Unity在运行时注入ICarRepository
container.RegisterType<ICarRepository, CarRepository>();
如何通过Unity向CarRepository注入CarAttributes但允许程序提供carId?
我认为我需要一家工厂才能这样做吗?
或许类似于以下内容
public class CarAttributesFactory()
{
private readonly ICarRepository _carRepository;
public CarAttributesFactory(ICarRepository carRepository)
{
_carRepository = carRepository;
}
public CarAttributes GetCarAttributes(int carId)
{
return new CarAttributes(_carRepository, carId);
}
}
这允许unity为工厂注入依赖项,但也允许程序在调用GetCarAttributes方法时指定carId。
然而,这不符合DI原则,因为我在CarAttributesFactory和CarAttributes类之间创建依赖。
这是使用工厂的正确用法吗?
此外,我已经阅读过有关其他DI框架的内容,例如TypedFactories这类东西,虽然我想首先手动完成以理解这些概念。
这里举个例子 Unity - Constructor Injection with other parameter
希望这是有道理的。
编辑:使用示例
从我的MVC控制器中,我需要能够为特定的carId检索CarAttributes对象,该对象将通过视图模型传递。 CarAttributes类需要使用一个或多个存储库(本示例中只显示一个),以及传递的运行时参数,其中carId取决于视图模型的内容。
(我还必须创建一个ICarAttributesFactory接口,以便在下面的例子中将工厂注入控制器)
public SomeController : Controller
{
private readonly ICarAttributesFactory _carAttributesFactory;
public SomeController(ICarAttributesFactory carAttributesFactory)
{
_carAttributesFactory = carAttributesFactory;
}
public ActionResult Submit(DataViewModel model)
{
// model will contain a carId property
var carAttribs = _carAttributesFactory.GetCarAttributes(model.carId);
if(carAttribs.IsStolen)
{
// do something
}
}
}