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

标签 c# .net dependency-injection inversion-of-control ninject

基于此问题的答案:Cyclic dependency with ninject这个问题:Ninject: give the parent instance to a child being resolved两者都表明,只要将作用域更改为不是默认的 Transient Scope,就可以使用两种方式的属性注入(inject)来解决循环依赖关系。所以我尝试这样做,我有一个 UserService 和一个 GroupService 相互需要(并且请不要说更改类或使用第三类等.!)。我有一个通用的 EntityServiceFactory ,它使用 ninject ,如下所示:

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

我只是选择了我的方式,因为它不需要我的服务具有特定的代码,以防万一我改变了它的用法,但称为 EntityServiceFactory.GetService 本质上与[注入(inject)] 属性。

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

相关文章:

c# - 在 linq to entities where 子句中建立两个列表之间的链接

c# - Swapchain.Present() 花费的时间太长,导致滞后

.net - 当访问间隔时间很长时,使 ASP.NET IIS 网站保持响应

c# - 在 .NET 应用程序中显式导致 AccessViolationException

c# - 如何根据 Web 应用程序 URL 为 Unity 容器动态注册类型(例如,不同的实现)?

php - 依赖注入(inject)容器与注册表模式

c# - 为什么 DrawRectangle 在我的 PictureBox 中绘制一个十字

c# - 嵌套使用 block

c# - 每个匹配生命周期范围的实例,默认?

c# - 从工作线程访问 UI 线程集合