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