Tag: 循环依赖

解决同时使用C#和F#的项目的循环引用

所以这是我的情况。 我在C#中有一个类库。 它公开了一些像Rectangle这样的类型。 它还公开了一些进行算法计算的方法。 在F#中编写这些算法位似乎是个好主意。 所以我在解决方案中添加了另一个F#库项目。 现在这是问题所在。 为了让F#项目进行算法计算,需要了解C#项目中的Rectangle 。 为了使C#项目能够使用F#函数,它需要引用F#项目。 所以有循环参考。 一种可能的解决方案是建立第三个项目,我可以在其中定义Rectangle ,然后从F#和C#引用该项目,然后从C#引用F#项目,这样我就可以使用这些函数了。 这个问题是我的库的用户不仅要引用我的C#项目,还要引用额外的第三个项目(因为使用需要为算法提供输入)。 这是不可接受的,因为使用F#只是一个实现细节,我不希望它在我的库使用方式上有任何开销。 所以我们假设Rectangle保留在C#项目中。 算法的F#实现(C#中调用函数的方法)的“接口”也在C#项目中。 如何将其全部链接以便它可以正常工作? 还有其他选择吗? 我拒绝循环引用似乎很奇怪。 像这样的紧密绑定的项目实际上没有有向图结构。 我知道有一个额外的方法。 F#项目有自己的Rectangle ,然后在两端进行序列化和反序列化。 这既乏味又与最初使用F#使我的代码更简单的想法相反。

循环依赖树,是否合理

我想出了一些解决方案,我的IoC / DI容器( Castle Windsor )声称有一个循环依赖树。 这是真的。 但我不确定这个循环是否有害。 这或多或少是依赖树: WebAPI控制器取决于…… …… 服务A取决于…… ……工作单位取决于…… ……存储库取决于…… …域事件管理器(1)取决于很多…… …域事件处理程序,一个取决于…… …… 服务A (2) (1) 域事件管理器是一个通用类,旨在协调由相同或其他域监听的具体域事件并执行副操作。 (2)这是依赖循环发生的地方 我的域事件管理和处理是在考虑面向方面的编程时实现的,因此,虽然它是依赖树的一部分,但给定的域事件处理程序可能依赖于或不依赖于同一依赖树中的服务:我认为域事件处理程序,如额外的顶级依赖项 。 但最坏的情况已经发生了。 我的观点是,由于域事件是一个交叉概念,给定的处理程序应该能够注入任何服务,甚至是已经存在于给定操作流的依赖树中的某个服务。 目前,我已经在受影响的域事件处理程序中使用属性注入修复了该问题,但无论如何可能有替代整个解决方法。

在自定义映射中调用IMappingEngine.Map

使用AutoMapper,当使用ConvertUsing为容器类型定义自定义映射时,我经常需要在映射函数中调用IMappingEngine.Map。 这是必要的,因为它允许我重用子映射的定义。 CreateMap() .ConvertUsing(o => new OrderModel( o.Id, o.ShippingAddress, mapper.Map<IList>(o.Items) )); 为了做到这一点,我需要一个IMappingEngine的引用。 在配置映射引擎时,我没有可以在ConvertUsing参数中捕获的引用。 一个简单的解决方案是在某个地方有一个静态引用,但我想避免它。 有没有办法在使用ConvertUsing的映射中获取对当前IMappingEngine的引用?

为什么C#中的类没有循环布局问题?

public struct Unit { Unit u; } 原因: 类型为“单元”的结构成员“Unit.u”会在结构布局中生成一个循环。 但 public class Unit { Unit u; } 编译。 我理解我认为的问题。 引用Unit对象时将形成无限循环,因为它必须初始化另一个成员Unit ,依此类推。 但是为什么编译器只为structs限制问题呢? 这个问题也不存在于class吗? 我错过了什么吗?

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

我有以下情况: 一个项目MyCompany.MyProject.Domain ,它包含我的域模型和部分类(如Contact )。 我希望’扩展’(通过部分类,而不是扩展方法)我的Contact类具有属性Slug ,它将为我提供一个简单的URL友好文本表示的名字和姓氏。 我在我的Utility项目MyCompany.MyProject.Utilities有一个字符串扩展方法ToSlug() ,它完全符合我想要的2)。 问题:My Utility项目已经引用了我的Domain项目,这意味着我无法让Domain项目看到Utility项目的ToSlug()方法而不会导致循环引用。 我并不热衷于创建另一个项目来解决这个问题,我真的希望保持Slug逻辑的共享。 我怎么解决这个问题?

循环generics类型参数

我有2个generics类,一个BaseComponent类和一个BaseManager类。 它们既抽象又有意成为具体的。 public abstract class BaseManager where T : BaseComponent public abstract class BaseComponent where T : BaseManager BaseManager有一个BaseComponents列表,这就是为什么我想让它成为通用的,所以PhysicsManager : BaseManager会有一个PhysicsComponents列表。 我想(或者更确切地说,我认为我需要) BaseComponent是通用的,因为我只希望从BaseComponent派生的类“附加”到它们适当的管理器。 理想情况下,我不想为每个派生组件编写构造函数,因此我可以将它添加到传递的具体管理器类中。 理想情况下,我想要一个采用抽象BaseManager类的构造函数。 我怎样才能管理这种循环依赖?

是否可以在程序集级别启用Visual Studio中的循环依赖项? 相互依赖的集会是否可能?

这可能听起来像一个愚蠢的问题,但无论如何我都会试一试。 因此在Visual Studio中,您不能有两个项目X和Y,以便X引用Y和Y引用X. 总的来说,由于各种原因,我完全可以理解循环依赖如何成为问题。 但是,以这种方式编译两个相互依赖的项目真的不可能吗? 在我看来,它必须是可能的,因为(在我看来 – 也许我完全偏离这个)有两个相互依赖的程序集实际上没有两个相互依赖的类 – 一个案例是合法的, 可以编译。 如果你说,“两个程序集不能相互依赖,因为编译器无法在另一个程序集之前编译”,这对我来说是有意义的; 除了看起来你可以在同一个程序集中为两个类创建相同的参数,显然编译器可以很好地处理这个场景。 基本上我问的原因并不是我有一些绝望的愿望去做这件事,我知道这通常是不明智的。 具体来说,我想知道,因为如果我可以有两个项目 – 比如MyProjectCS和MyProjectVB – 基本上作为单个单元的两个相互依赖的部分存在,并且只是分开因为某些部分是用C#编写的,这将是很好的。其他部分都是用VB.NET编写的。 所以,我的问题是(yikes,three-fold): 是否可以启用此行为(在Visual Studio中或其他地方)? 如果在任何IDE中都不可能,至少在理论上是否可行,或者是否可能存在相互依赖的程序集? 如果理论上不可能,为什么不呢? 换句话说,相互依赖的程序集如何与单个程序集中的相互依赖的代码不同?

在C#中,如何找到循环依赖链?

当一个部署项目包含第二个部署项目的项目输出,而第二个项目包含第一个项目的输出时,通常会发生此错误。 我有一个检查循环依赖的方法。 在输入中,我们有一个字典,其中包含例如<"A", >和<"B", > ,这意味着A取决于在B和C ,我们与A->B有循环依赖关系。 但通常我们会有一个更复杂的情况,有一连串的依赖。 如何修改此方法以查找依赖链? 例如,我想要一个包含链A->B->A的变量,而不是A类与B类冲突。 private void FindDependency(IDictionary<string, IEnumerable> serviceDependence)

清洁处理EF中的循环引用的方法?

说我有这个表结构: Client ———– ClientId int not null (identity) CurrentDemographicId int null (FK to ClientDemographic) OtherClientFields varchar(100) null ClientDemographic —————— ClientDemographicId int not null (identity) ClientId int not null (FK to Client) OtherClientDemographicFields varchar(100) null 我们的想法是Client(在EF中)将具有ClientDemographics列表和CurrentDemographic属性。 问题是当我设置对象结构并尝试保存它时,我收到此错误: 无法确定相关操作的有效排序。 由于外键约束,模型要求或存储生成的值,可能存在依赖关系 这个错误是有道理的。 我在表格设置中有一个循环引用。 它不知道首先插入哪个实体(因为它同时需要来自两个表的Id)。 所以,我一起攻击了一个看起来像这样的解决方案: // Save off the unchanged ClientDemograpic ClientDemographic originalClientDemographic = client.CurrentClientDemographic; // Merge the […]

C#中两个项目的循环依赖

我在名为ProjectA(ConsoleApplication)和ProjectB(ClassLibrary)的解决方案中有两个项目。 ProjectA引用了ProjectB。 一般来说,ProjectA调用ProjectB中的方法来执行一些操作并将结果返回给ProjectA。 但有时,我需要ProjectB向ProjectA发送一些“附加”信息(更具体地说,是调用ProjectA中的Console.WriteLine()方法)。 为了实现这一点,我需要在ProjectB中引用ProjectA,但是当我尝试这样做时,我收到以下错误: A reference to ProjectA could not be added. Adding this project as a reference would cause a circular dependency A reference to ProjectA could not be added. Adding this project as a reference would cause a circular dependency 。 我理解整个耦合概念,并且获取此消息确实有意义,但是,在某些情况下,我需要向ProjectA发送其他信息。 有任何想法吗?