尝试添加引用

时间:2017-06-08 08:29:56

标签: c#

在我的解决方案中,有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的引用,因为它将导致循环依赖。我该如何继续这样做。正在创建一个接口来解决这个问题以及如何解决这个问题。

4 个答案:

答案 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

现在可以编译所有代码。您将分发的程序集将是AB_A项目发出的程序集。

您永远不会将代码添加到B_AB_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将使用反射来查找和注册实现以进行事件处理。

我敢肯定其他系统也有类似的东西,这是解决这些问题的我最喜欢的方式