3

我在 mvc 3(steven sanderson Scaffolder)的存储库模式中使用 Ninject 3。
在ninject中,我有“NinjectWebCommon”类,在“RegisterServices”方法中我解决了依赖关系,我认为我准备好了。

  private static void RegisterServices(IKernel kernel)
  {
     kernel.Bind<ICityRepository>().To<CityRepository>();
     kernel.Bind<IVillageRepository >().To<VillageRepository>();
  }

我使用构造函数注入在控制器中使用我的存储库,一切都很好。

public class CityController : Controller
{
   private readonly ICityRepository cityRepository;

   // If you are using Dependency Injection, you can delete the following constructor
   //public CityController() : this(new CityRepository())
   //{
   //}

   public CityController(ICityRepository cityRepository)
   {
      this.cityRepository = cityRepository;
   }

  // .........
}

但是当我在其他类(如使用属性注入或字段注入的模型(实体)类)中使用此存储库时,依赖项没有解决,并且我的属性或字段上出现空引用异常。

[MetadataType(typeof(CityMetadata))]
public partial class City : IValidatableObject
{
   [Inject]
   public IVillageRepository VillageRepo { get; set; }

   public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
   {
      var village = VillageRepo.Find(5); // will throw null reference exception on "VillageRepo"
   }
}

public partial class CityMetadata
{
   [ScaffoldColumn(false)]
   public int ID { get; set; }

   [Required(ErrorMessage = MetadataErrorMessages.Required)]
   [StringLength(50, ErrorMessage = MetadataErrorMessages.ExceedMaxLength)]
   public string Name { get; set; }
}

我不知道为什么会这样。那么问题出在哪里,我如何在非控制器类中使用存储库?
提前致谢。

4

1 回答 1

3

你的问题是,你期待魔法。您为存储库注入一个实现,然后您希望该存储库创建的数据对象被注入创建存储库的引用。

首先,那是行不通的。存储库的实现将在您的实体上调用 new()(或 Activator.CreateInstance),而不是从 Ninject 内核或工厂请求实例。您可以重写存储库(如果您在那里使用 EF,它会变得更加棘手......)但这可能不值得麻烦。

最重要的是,您根本不需要它。实体不应该依赖于 repositories,恕我直言,甚至不依赖于它们的接口。

编辑:现在我明白为什么你想在你的模型中看到一个 repo。我推荐的是一个静态工厂。

public class Factories
{
public static readonly Instance = new Factories();
[Inject]
public Func<IVillageRepository> VillageRepo  {get; set;}
}

然后Kernel.Inject(Factories.Instance);从您的 Ninject 初始化代码(绑定 IVillageRepository 的位置)调用。然后将您的可验证实现修改为Factories.Instance.VillageRepo().Find(...);

于 2012-11-05T15:41:49.687 回答