这是我想要做的一个非常基本的例子。在真实性中,有更多的关系,但不是极端或记忆沉重。
public class ClassA : ISomething
{
public double property { get; set; }
...
public ClassB classb { get; set; }
}
public class ClassB : ISomething2
{
public double Length { get; set; }
...
}
public class MyProject : BaseProject
{
public IEnumerable<ISomething> ISomethings { get; set; }
...
public IEnumerable<ISomething2> ISomethings2 { get; set; }
...
}
这里的问题是我必须保留ClassA的ISomethings2
和classb
属性列表,以仅引用ISomething2
列表中的现有项。这里很难的是:
ISomething2
中删除项目应删除对它的所有引用(ClassA实例的classb
属性设置为null)classb
属性设置为列表中的非现有对象或新用户创建的对象。ISomethings2
中的对象可以存在而不被引用。这些类用于项目描述而不是数据库的东西。就像打开应用程序的项目文件一样。因此,更改classB中的属性应该对所有人都可见,因为它是相同的对象引用。 是否有一种模式可以实现我想要的而不需要很多耦合?也欢迎替代设计/方法。
答案 0 :(得分:1)
您需要一个Manager
类,并在您的类中添加一些行为。
首先是ManagerClass
public class ManagerClass{
public IEnumerable<ISomething> ISomethings { get; set; }
public IEnumerable<ISomething2> ISomethings2 { get; set; }
public void RemoveSomething2(ISomething2 something2){
//iterate through ISomething and remove the ClassB reference
}
}
ClassA
接受ManagerClass
构造函数,撤销ClassB
设置属性。
public class ClassA : ISomething
{
public ClassA (ManagerClass managerClass){
this.managerClass = managerClass;
}
public double Property { get; set; }
private ManagerClass managerClass = null;
public ManagerClass ManagerClass { get { return managerClass; } }
private ClassB classB null;
public ClassB ClassB { get{ return classB; } }
public void SetClassB(ClassB classB){
// check whether
if(classB != null && !ManagerClass.ISomethings.Any(k=> k==classB)){
this.classB = classB;
}
// set null
else if(classB == null){
this.classB = null;
}
else {
throw new Exception("not found");
}
}
}
虽然我更喜欢带关系模型的简化版本。
public class SomethingRelation{
public ISomething something;
public ISomething2 something2;
}
public class ManagerClass{
public IEnumerable<ISomething> ISomethings { get; set; }
public IEnumerable<ISomething2> ISomethings2 { get; set; }
public IEnumerable<SomethingRelation> Relations { get; set; }
public void RemoveSomething2(ISomething2 something2){
//iterate through SomethingRelation and remove all the something2 reference
}
}
答案 1 :(得分:0)
嗯,personaly我会用ClassBId替换ClassA中的ClassB对象,只有一个列表。
BUT!如果你想保留结构,你可以使项目ISomething2可枚举链接到ISomethign1可枚举。即
public class MyProject
{
public IEnumerable<ISomething> ISomethings { get; set; }
public IEnumerable<ISomething2> ISomethings2 {
get { return this.ISomethings.Select(i => i.classB); }
}
public void RemoveSomething(ISomething2 s)
{
foreach (var somthing in this.ISomethings.Where(i => i.classB == s))
{
somthing.classB = null;
}
}
}