C#依赖注入传递附加参数

时间:2015-01-21 18:06:38

标签: c# asp.net-mvc dependency-injection unity-container factory

我有一个类似于以下的类:

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 
      }
   }

} 

0 个答案:

没有答案
相关问题