假设我在解决方案中有多个项目。我有主项目parent_project
和另一个项目child_project
。
如何从parent_project
访问位于child_project
的类/命名空间?
我已在child_project
中添加了对parent_project
的引用,因此我无法在parent_parent
中添加对child_project
的引用,因为它会创建循环依赖关系
这可能吗?
答案 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);
}
}
}
Read from child: b
Call from child: Populate method in parent: cc
答案 4 :(得分:0)
我不得不说Yannicks的答案是通常去那里的方式。在您的特殊情况下(如您对他的回答的评论中所述),听起来这会有问题。不同的方式是(只有在mainclass编译成dll时才有可能):
这是一种可能的其他途径但由于反思有其自身的麻烦,因此存在相当多的陷阱。