我具有以下程序集层次结构:
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,并在需要的地方进行强制转换以获取新属性.