其他分享
首页 > 其他分享> > CodeGo.net>如何添加属性到现有接口?

CodeGo.net>如何添加属性到现有接口?

作者:互联网

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

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

标签:composition,c,net,design-patterns
来源: https://codeday.me/bug/20191208/2088246.html