gpt4 book ai didi

asp.net-mvc-3 - 使用 ninject 注入(inject)对模型类或非 Controller 类的依赖

转载 作者:行者123 更新时间:2023-12-02 09:23:04 24 4
gpt4 key购买 nike

我在 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>();
}

我使用构造函数注入(inject)在 Controller 中使用我的存储库,一切都很好。

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

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

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

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

我不知道为什么会发生这种情况。那么问题是什么以及如何在非 Controller 类中使用存储库?
提前致谢。

最佳答案

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

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

最重要的是,您根本不需要它。 Entities shouldn't depend on repositories ,恕我直言,甚至连他们的界面都没有。

编辑:现在我明白为什么你想在模型中看到存储库了。我推荐的是静态工厂。

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

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

关于asp.net-mvc-3 - 使用 ninject 注入(inject)对模型类或非 Controller 类的依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13212817/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com