我的C#项目中的循环引用

时间:2009-08-23 09:05:11

标签: c# circular-dependency

我有以下情况:

  1. 包含我的域模型和部分类(例如MyCompany.MyProject.Domain)的项目Contact

  2. 我想'扩展'(通过部分类,而不是扩展方法)我的Contact类,其属性为Slug,这将为我提供一个简单的URL友好文本表示形式的第一个和最后一个名称

  3. 我的ToSlug()项目Utility中有一个字符串扩展方法MyCompany.MyProject.Utilities,它正是我想要的2)。

  4. 问题:我的Utility项目已经引用了我的Domain项目,这意味着我无法让Domain项目看到Utility项目ToSlug()方法,不会导致循环引用。

  5. 我并不热衷于创建另一个项目来解决这个问题,我真的希望保持共享Slug逻辑。

    我该如何解决这个问题?

4 个答案:

答案 0 :(得分:14)

引用您的Utility的{​​{1}}项目似乎有点代码味道。我假设这些是专门用于域对象的实用程序 - 如果是这种情况,那么为什么不在MyCompany.MyProject.Domain项目中包含MyCompany.MyProject.Utilities(当然,相应地修改名称空间) ?

在任何情况下,打破这些依赖关系的常规方法是将一个项目所需的内容抽象为一组接口,并将它们封装在单独的程序集中。在此之前,请确保您正在做的概念是正确的。

在您的特定情况下,请考虑引入一个界面,即Domain

INameHolder

然后public interface INameHolder { string FirstName { get; set; } string LastName { get; set; } } 实施ContactINameHolder存在于另一个程序集中,我们称之为INameHolder

然后,您的MyCompany.MyProject.Domain.Interfaces项目引用Utilities Interfaces),Domain也是如此,但Domain没有引用任何东西 - 循环引用被打破。

答案 1 :(得分:2)

将ToSlug方法复制到Domain项目和Delegate Utility的ToSlug调用此新方法

答案 2 :(得分:2)

如果你不能共享域(可能是正确的)并且它必须使用共享库中的逻辑,那么你真的必须引入另一个程序集。

或者您可以通过域中的反射在域中的运行时加载逻辑以访问依赖库。它并不难打破编译时检查。

答案 3 :(得分:2)

如果您确定将代码保存在实用程序DLL中(Eric的答案对我来说似乎很聪明),那么您可以在实用程序项目中创建一个接口,将该接口作为参数传递给ToSlug方法,然后让您的域对象实现接口。