C#从“子项目”中的“父项目”访问一个类?

时间:2015-02-10 09:05:34

标签: c# namespaces

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

如何从parent_project访问位于child_project的类/命名空间?

我已在child_project中添加了对parent_project的引用,因此我无法在parent_parent中添加对child_project的引用,因为它会创建循环依赖关系

这可能吗?

5 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:2)

您可以使用子项目中定义的接口注入您的依赖项(这在无法进行主要重构/太昂贵的情况下非常有用。)

e.g。在儿童项目中:

interface IA {
   DoLogicInB();
}

在父项目中:

class ConcreteA : ChildProject.IA
{
    DoLogicInB() { ... }
}

在子项目中,您需要逻辑:

class ChildB {
   void DoSomethingWithParent(IA logicEngine) {
       logicEngine.DoLogicInB();
   }
}

然后,您需要能够从子项目外部注入父对象的具体实现。

答案 2 :(得分:1)

FYI

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

答案 3 :(得分:1)

我不需要整个名称空间,而只是读取一些数据字典或从父项目类调用一个特定方法。这就是我们如何使其工作的方式。

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);
        }
    }
}

在子级中使用父项目类数据

  1. 之前,propertyCache在父类中。孩子需要访问它。
  2. 因此,propertyCache已移至Child。父级也会读取并填充相同的内容。

在子级中使用父项目类方法

  1. 以某种静态方法将方法引用传递给子级。
  2. 使用引用来调用该父方法。

程序输出

Read from child: b
Call from child: Populate method in parent: cc

答案 4 :(得分:0)

我不得不说Yannicks的答案是通常去那里的方式。在您的特殊情况下(如您对他的回答的评论中所述),听起来这会有问题。不同的方式是(只有在mainclass编译成dll时才有可能):

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

这是一种可能的其他途径但由于反思有其自身的麻烦,因此存在相当多的陷阱。