gpt4 book ai didi

c# - Ninject,使用两种方式的属性注入(inject)来解决循环依赖

转载 作者:太空宇宙 更新时间:2023-11-03 11:00:26 25 4
gpt4 key购买 nike

基于这个问题的答案:Cyclic dependency with ninject这个问题:Ninject: give the parent instance to a child being resolved这两个都说你可以使用双向属性注入(inject)来解决循环依赖,只要你将范围更改为不是默认的 transient 范围。所以我尝试这样做,我有一个 UserService 和一个 GroupService 彼此需要(请不要说更改类或使用第三类等.!).我有一个像这样使用 ninject 的通用 EntityServiceFactory:

public static class EntityServiceFactory
{
public static TServiceClass GetService<TServiceClass>()
where TServiceClass : class
{
IKernel kernel = new StandardKernel();
return kernel.Get<TServiceClass>();
}
}

还有我的服务:

public class GroupService : EntityService<GroupRepository, Group, DbContext>
{
public UserService _userService { private get; set; }


public GroupService(GroupRepository repository, UserService userService) : base(repository)
{
userService._groupService = this;
}

public class UserService : EntityService<UserRepository, User, DbContext>
{
public GroupService _groupService { private get; set; }

public UserService(UserRepository repository, GroupService groupService)
: base(repository)
{
groupService._userService = this;
}

然后按照这些问题的答案中的说明,将以下内容添加到我的 EntityServiceFactory:

kernel.Bind<GroupService>().ToSelf().InCallScope();
kernel.Bind<UserService>().ToSelf().InCallScope();

但我仍然得到错误:

A cyclical dependency was detected between the constructors of two services.

我是否正确地进行了双向属性注入(inject)?我该如何解决这个问题?

最佳答案

好吧,原来我不明白我链接的问题中的答案。我根本没有做任何类似属性注入(inject)的事情,我最终做的是这样的:

只要有循环依赖,我就会从构造函数中删除一个循环诱导服务,并将其替换为:

    private UserService _userService;
private UserService UserService
{
get { return _userService ?? (_userService = EntityServiceFactory.GetService<UserService>()); }
}

这实际上最终非常接近属性注入(inject) (http://ninject.codeplex.com/wikipage?title=Injection%20Patterns)。它不像构造函数注入(inject)那样最佳,但仍然不是一个糟糕的解决方案。我也可以这样做(实际属性(property)注入(inject)):

    private UserService _userService;
[Inject]
private UserService UserService
{
get { return _userService; }
set { _userService = value; }
}

我只是选择了我的方式,因为它不需要我的服务有 ninject 特定代码,以防我改变我的使用方式,但是调用 EntityServiceFactory.GetService 本质上与[Inject] 属性。

关于c# - Ninject,使用两种方式的属性注入(inject)来解决循环依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17863712/

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