2

基于这个问题的答案:带有ninject的循环依赖和这个问题:Ninject:将父实例给正在解决的孩子这两个都说只要您将范围更改为,您就可以使用两种方式属性注入来解决循环依赖不是默认的瞬态作用域。所以我尝试这样做,我有一个需要彼此的 aUserService和 a 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();

但我仍然得到错误:

检测到两个服务的构造函数之间存在周期性依赖关系。

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

4

1 回答 1

2

韦尔普,原来我不明白我链接的问题的答案。我根本没有做任何类似属性注入的事情,我最终做的是:

每当存在循环依赖时,我都会从构造函数中删除其中一个循环诱导服务并将其替换为:

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

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

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

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

于 2013-07-25T20:22:10.463 回答