gpt4 book ai didi

c# - 两个服务相互依赖(stackoverflow异常)——如何解决?

转载 作者:行者123 更新时间:2023-12-02 17:42:49 25 4
gpt4 key购买 nike

我是依赖注入(inject)的新手,我正在尝试解决一个问题。我有两个服务。这些服务中的每一个都有需要彼此的方法。

例如:SiteManager 有需要我的 ForumManager 的方法。我的 ForumManager 有需要我的 SiteManager 的方法。

我有以下两个类:

public class SiteManager:ISiteManager
{
public IForumManager ForumManager { get; set; }

public SiteManager()
{
this.ForumManager = new ForumManager();
}
}

public class ForumManager:IForumManager
{
public ISiteManager SiteManager { get; set; }

public ForumManager()
{
this.SiteManager = new SiteManager();
}
}

很明显,这将导致堆栈溢出异常,因为他们互相调用。我在这里阅读了很多帖子,我想我只需要一个关于如何解决这个问题的小提示。我在他们自己的程序集中有我的接口(interface)。

我想过将依赖项放在它们自己的属性中,这样当它们被使用时,它们就会被创建。然而,这是最佳实践吗?

我不使用 IoC 容器(我以前也没有用过)。

有关如何以“最佳实践”方式解决此特定问题的任何提示! :-)

最佳答案

你不应该在你的类中调用 new,这会使它们紧密耦合。允许您使用模拟分别测试每个类的 IOC 的正确模式是:-

public class SiteManager:ISiteManager
{
private readonly IForumManager forumManager;

public SiteManager(IForumManager forumManager)
{
this.forumManager = forumManager;
}
}

public class ForumManager:IForumManager
{
private readonly ISiteManager siteManager;

public ForumManager(ISiteManager siteManager)
{
this.siteManager = siteManager;
}
}

但是,这并没有解决相互递归问题。解决这个问题的最简单方法是不对其中一个类使用构造函数注入(inject),而是使用属性注入(inject),即将 SiteManager 放回 ForumManager 的公共(public)属性,并在创建两个对象后设置它。

然后您的设置代码会:-

     IForumManager forumManager = new ForumManager();
ISiteManager siteManager = new SiteManager(forumManager);
forumManager.SiteManager = siteManager;

另一种选择是将 ForumManagerFactory 传递到 SiteManager,例如一个Func<ISiteManager,IForumManager> .

     ISiteManager siteManager = new SiteManager((s) => new ForumManager(s));

然后您可以在站点管理器中调用 Func,传递 this获取 IForumManager。 ForumManager 获取 SiteManager 的实例,而 SiteManager 具有 ForumManager 对象。

关于c# - 两个服务相互依赖(stackoverflow异常)——如何解决?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18505282/

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