我具有以下程序集层次结构:

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,并在需要的地方进行强制转换以获取新属性。

10-05 22:24