在我的解决方案中,有2个项目:Helper和Service.Helper项目都有对服务的引用
在帮助项目中我有
文化助手
public static class CultureHelper
{
public static Location GetLocationBasedOnCulture(string cultureName)
{
Location location = Location.UK;
if (cultureName == Constants.CultureConstants.Italy)
{
location = Location.Italy;
}
return location;
}
}
文化常数:
public static class CultureConstants
{
public static readonly string UK = "en-GB";
public static readonly string Italy = "it-IT";
}
在服务中我试图添加此方法:
public Enum DetermineLocation()
{
var culture = CultureHelper.GetCurrentCulture();
Location location = CultureHelper.GetLocationBasedOnCulture(culture);
return location;
}
我正在尝试向使用静态CultureHelper类的服务添加一个方法,但是我无法在服务中添加对helper的引用,因为它将导致循环依赖。我该如何继续这样做。正在创建一个接口来解决这个问题以及如何解决这个问题。
答案 0 :(得分:2)
您无法在已经审核过您的第一个项目的项目中添加项目的引用。说
您有两个项目 ProjectA 和 ProjectB 现在,您在 ProjectA 中添加 ProjectB 的引用 当您尝试在 ProjectB 中添加 ProjectA 的引用时,您将获得循环依赖,因为您将彼此指向一个项目。
因此,要解决此问题,您应该创建 ProjectC ,添加对 ProjectB 的引用,最后您可以在中添加 ProjectC 的引用项目A 强>
答案 1 :(得分:1)
1)创建第三个项目(C),其中包含项目A和B共有的类型,让A和B引用C。
2)在B中移动类型,这取决于A到A中的类型(反之亦然)。
答案 2 :(得分:0)
如果您的项目真的需要相互交叉引用,并且您无法使用其他建议进行重组,那么这里将演示如何实现相互交叉引用。
在Visual Studio中,创建一个新的解决方案并添加名为A
的普通类库。单独留下Class1
。
创建共享项目并将其命名为Proto_B
。添加一个名为Class1
的类,并将其名称空间声明更改为B
。
创建名为B_NonA
的类库。删除Class1
。添加对Proto_B
的共享项目引用,并更改设置,使其默认命名空间为B
,并发出B
程序集。将项目A
中的引用添加到项目B_NonA
。
创建名为B_A
的类库。删除Class1
。添加对Proto_B
的共享项目引用,并更改设置,使其默认命名空间为B
,并发出B
程序集。同时将其设置为包含所有配置的条件编译符号HASA
。将项目B_A
中的引用添加到项目A
。
现在可以编译所有代码。您将分发的程序集将是A
和B_A
项目发出的程序集。
您永远不会将代码添加到B_A
或B_NonA
,只会添加到ProtoB
。代码必须实际使用A
程序集功能时,该代码应包含在#if HASA
块中。
在这个玩具示例中,A.Class1
是:
namespace A
{
public class Class1
{
private static B.Class1 _otherB = new B.Class1();
}
}
B.Class1
中的ProtoB
是:
namespace B
{
public class Class1
{
#if HASA
private static A.Class1 _otherA = new A.Class1();
#endif
}
}
这种方法的一个明显缺点是它会导致更长的构建时间,因为B
中的任何更改都需要B
重建两次,并在其间执行构建A
。 / p>
答案 3 :(得分:0)
如果您使用的是nopcommerce,请查看事件发布者。
在核心nop文件中注册您的事件,然后在需要将数据传递回去的循环问题中,在插件中构建事件处理程序。 当您从插件A发布事件时,您通过该对象传递对象等,它们将在插件B中可用:)
来自nopcommerce:
要发布事件,开发人员将需要获取IEventPublisher的实例,并使用适当的事件数据调用Publish方法。 为了侦听事件,开发人员将要创建通用IConsumer接口的新实现。创建新的使用者实现后,nopCommerce将使用反射来查找和注册实现以进行事件处理。
我敢肯定其他系统也有类似的东西,这是解决这些问题的我最喜欢的方式