我具有以下程序集层次结构:
MyRoot
MyRoot.General
MyRoot.General.Model
MyRoot.General.MyApp
每个程序集都应引用从MyApp到MyRoot的所有内容。换句话说,MyRoot不应引用任何这些程序集。 MyApp可以引用所有这些。
MyRoot.General包含一个名为IMyContext的接口。在模型和MyApp命名空间中使用IMyContext在应用程序实例的生存期内提供实例数据。问题是我需要向IMyContext添加另一个属性,以便可以通过Model和MyApp命名空间访问Model命名空间中的类实例(就像IMyContext实例一样)。但是,那时MyRoot.General必须引用MyRoot.General.Model程序集。我可以在Model内部为此类创建一个单例,但是基本上我有两个上下文可以跟上-IMyContext和MyRoot.General.Model.MySingleton。
有一个更好的方法吗?我认为这可能是某种类型的构图。
此外,现有的应用程序正在使用MyRoot.General.IMyContext。向IMyContext添加新属性将有太多的重构和风险。
最佳答案
为什么不在MyRoot.General中定义所需类的接口,然后在MyRoot.General.Model中提供该接口的实现。据推测,您已经传递了IMyContext-根据需要新类的位置,可以将其附加到模型或附加可以为您解决该问题的服务。
假设存在:
namespace MyRoot.General {
public interface IMyContext {
/// Some irrelevant stuff here
}
}
为什么不定义:
namespace MyRoot.General {
public interface IMyOtherThing {
/// Some new stuff here
}
}
并在MyRoot.General.Model内部实现:
namespace MyRoot.General.Model {
public class MyOtherThing : MyRoot.General.IMyOtherThing {
/// Some new stuff here
}
}
然后使用IMyContext上的新属性传递它
然后添加一个新接口IMyContextEx:
namespace MyRoot.General {
public interface IMyContextEx : IMyContext {
IMyOtherThing MyOtherThing { get; set; }
}
}
最后,在实现IMyContext的同一类上实现IMyContextEx,并在需要的地方进行强制转换以获取新属性。