Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C“从a访问类”;“母项目”;在“a”中;儿童项目;?_C#_Namespaces - Fatal编程技术网

C# C“从a访问类”;“母项目”;在“a”中;儿童项目;?

C# C“从a访问类”;“母项目”;在“a”中;儿童项目;?,c#,namespaces,C#,Namespaces,假设我在一个解决方案中有多个项目。我有主项目父项目和另一个项目子项目 如何从子项目访问驻留在父项目中的类/名称空间 我已经在parent\u project中添加了对child\u project的引用,因此无法在child\u project中添加对parent\u parent的引用,因为这会创建循环依赖关系 这可能吗?如果在项目之间共享逻辑,则需要隔离该依赖项并将其移动到共享位置(例如,新项目),重新构造依赖项,以便核心逻辑位于类似项目的核心域中,或者将项目混合在一起 后者并不是最干净的解

假设我在一个解决方案中有多个项目。我有主项目
父项目
和另一个项目
子项目

如何从
子项目
访问驻留在
父项目
中的类/名称空间

我已经在
parent\u project
中添加了对
child\u project
的引用,因此无法在
child\u project
中添加对
parent\u parent
的引用,因为这会创建循环依赖关系


这可能吗?

如果在项目之间共享逻辑,则需要隔离该依赖项并将其移动到共享位置(例如,新项目),重新构造依赖项,以便核心逻辑位于类似项目的核心域中,或者将项目混合在一起


后者并不是最干净的解决方案。我建议您考虑一下自己的问题,并真正尝试回答“为什么我需要循环引用?我如何重组以使我的依赖关系有意义?”

我必须说,Yannicks的答案是正常的解决方法。在你的特殊情况下(正如你在对他的回答的评论中所概述的那样),这听起来是有问题的。另一种方法是(仅当mainclass编译成dll时才可能):

  • 在子项目中包含主项目的已编译dll
  • 通过反射使用您需要的方法

这是另一种可能的途径,但也有不少缺陷,因为反射本身也有问题。

您可以使用子项目中定义的接口注入依赖项(这在不可能进行主要重构/重构成本太高的情况下非常有用)

e、 g.在儿童项目中:

interface IA {
   DoLogicInB();
}
在父项目中:

class ConcreteA : ChildProject.IA
{
    DoLogicInB() { ... }
}
在子项目中,您需要以下逻辑:

class ChildB {
   void DoSomethingWithParent(IA logicEngine) {
       logicEngine.DoLogicInB();
   }
}
然后,您需要能够从子项目外部注入父对象的具体实现。

FYI


我最终只是将逻辑复制到一个共享位置,“子”项目可以访问这个版本。从可维护性的角度来看,我知道这不是最好的解决方案,但似乎是最好的折衷方案。

我不需要整个名称空间,只需要阅读一些数据字典或从父项目类调用一个特定的方法。下面是我们如何让它工作的

using System;
using NUnit.Framework;
using System.Collections.Concurrent;

namespace MyProject.tests
{
    public class ParentChildTest
    {
        [Test]
        public void dataAndMethodTest()
        {
            // add the data in parent project
            Parent.propertyCache["a"] = "b";

            // read the data in child project
            Console.WriteLine("Read from child: " + Child.getProperty("a"));

            // use Child project to call method of parent project
            Console.WriteLine("Call from child: Populate method in parent: " + Child.populate("c"));
        }
    }

    class Parent
    {
        // data is in Child project. Parent project just has the reference.
        public static ConcurrentDictionary<string, string> propertyCache = Child.getPropertyCache();

        public static string populate(string key)
        {
            //calculation
            string value = key + key;
            propertyCache[key] = value;
            return value;
        }

        // Pass the parent project method reference to child project
        public static int dummy = Child.setPopulateMethod(populate);
    }

    class Child
    {
        // data store
        static ConcurrentDictionary<string, string> propertyCache = new ConcurrentDictionary<string, string>();

        public static ConcurrentDictionary<string, string> getPropertyCache()
        {
            return propertyCache;
        }

        public static string getProperty(string key)
        {
            if (propertyCache.ContainsKey(key))
            {
                return propertyCache[key];
            }
            return null;
        }

        // reference to parent project method
        static Func<string, string> populateMethodReference = null;

        public static int setPopulateMethod(Func<string, string> methodReference)
        {
            populateMethodReference = methodReference;
            return 0;
        }

        public static string populate(string key)
        {
            return populateMethodReference(key);
        }
    }
}

从父项目类继承子项目。如果你不给我看你的班级,那不是确切的答案,所以我会加上它作为一个评论-你将无法添加双重引用,我建议将孩子和家长中使用的共同点转移到一个单独的“共同”项目中,然后从孩子和家长那里引用它。情况相同。正如您所说的,循环引用是由于子类的功能依赖于父类。如果你想让两者都有一些共同的功能,并且不费吹灰之力地使用它,最好的办法就是把它们移到一个共同的地方。。。首先在父项目中创建方法不是更好吗?另一件有趣的事情是在.net 2 MS中创建了这样一个技巧系统。Xml引用了系统,反之亦然,但它们不允许对其他任何人这样做!这似乎是一般性的建议,不幸的是,我试图使用的代码片段在整个主项目中大量使用,并且仅在子项目中的一个地方需要,并且它为子项目提供的功能相对较小。。。重组将是一项巨大的工作。。。我希望能有一个快速的解决办法…恐怕没有快速的解决办法。还有另一个选择,但公平地说,这是一个可怕的选择,那就是在本地nuget repo上托管父程序集,并将其拉到子项目中。这是一种非常非常混乱的实现方式,本质上是,将程序集的xcopy复制到bin文件夹中,所以我真的不推荐它,但它已经在桌面上了(老实说,我自己没有尝试过,所以我不能保证它可以工作,但理论上它可以工作)。这种方式听起来几乎和使用反射一样混乱(您必须在其中引用mainproject的dll:/)这听起来和Yannicks的建议几乎一样,只是我复制了而不是移动了,所以主项目仍然访问它自己的版本。该版本的唯一问题是,如果代码中有任何更改,您需要小心,因为您在两个代码部分都做了更改。
Read from child: b
Call from child: Populate method in parent: cc