C#如何解决EditorAttribute使用导致的循环依赖?

时间:2011-06-01 10:33:34

标签: c# circular-dependency

在我的项目中,我有两个库,这些库目前会导致循环依赖,我无法解决。

一个库为整个解决方案提供通用数据结构。该库包含类似于以下的构造:

namespace Common {
  public class Foo {
    //[Editor( typeof( UserEditor ), typeof( UITypeEditor ) )]
    public UInt32 OwnerId { get; set; }
  }

  public class User {
    public UInt32 Id { get; set; }
  }
}

现在在我们解决方案的一个项目中,我们希望通过PropertyGrid编辑Foo个实例,并且应该使用自定义编辑器编辑OwnerId属性;这一个:

using Common;

namespace Common.Gui {
  public class OwnerEditor : UITypeEditor {
    public static List<User> Users { get; set; }
  }
}

现在,我不能只将EditorAttribute添加到Foo.OwnerId,因为这会创建一个循环依赖项,我希望在Common.Gui之外保留对Common的引用无论如何。我还想避免将代码从Common中拉出到新程序集中,因为很多其他项目都引用它。

我发现了一个关于adding EditorAttribute at runtime的问题,这听起来像是一个完美的解决方案,但我无法擅长解决我的问题。

2 个答案:

答案 0 :(得分:2)

我认为这是设计有缺陷的标志。您是否希望包含Foo的类库不知道编辑GUI?在这种情况下,它不应包含EditorAttribute。

一种解决方案可能是将Foo类视为MVVM架构中的模型。然后,您可以在应用EditorAttribute的GUI类库中创建包装ViewModel。如果您提取我放置在模型类库中的接口IFoo,则可以使用装饰器模式。

答案 1 :(得分:2)

您可以按名称引用编辑器类以创建运行时引用。

public class Foo {
    [Editor( "Common.Gui.OwnerEditor, Common", typeof( UITypeEditor ) )]
    public UInt32 OwnerId { get; set; }
  }