在我的项目中,我有两个库,这些库目前会导致循环依赖,我无法解决。
一个库为整个解决方案提供通用数据结构。该库包含类似于以下的构造:
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的问题,这听起来像是一个完美的解决方案,但我无法擅长解决我的问题。
答案 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; }
}