如何为外部库Feed类创建占位符,消除依赖并支持主应用依赖注入?
解决方案:隔离外部Feed类依赖的几种实现方式
1. 定义抽象接口作为占位符
在自有库中创建一个与外部Feed类属性匹配的抽象接口,让Setup方法依赖这个接口而非具体的外部类。主应用层再实现该接口,完成外部Feed类到自有库接口的适配。
自有库代码:
// 自有库中定义的Feed数据抽象接口,作为外部Feed类的占位符 public interface IFeedData { string title { get; } string text { get; } DateTime CreationTime { get; } string subtitle { get; } int likes { get; } } // 修改原有Setup方法,依赖抽象接口 public override void Setup(IFeedData feedData) { SetTitle(feedData.title); SetText(feedData.text); SetDate(feedData.CreationTime); SetSubTitle(feedData.subtitle); SetLikes(feedData.likes); }
主应用层适配代码:
// 主应用中引用外部Feed类,实现自有库的IFeedData接口 public class FeedAdapter : IFeedData { private readonly Feed _externalFeed; public FeedAdapter(Feed externalFeed) { _externalFeed = externalFeed; } public string title => _externalFeed.title; public string text => _externalFeed.text; public DateTime CreationTime => _externalFeed.CreationTime; public string subtitle => _externalFeed.subtitle; public int likes => _externalFeed.likes; } // 使用时传入适配后的实例 var externalFeed = new Feed(...); var adapter = new FeedAdapter(externalFeed); yourLibraryInstance.Setup(adapter);
2. 使用动态类型(Dynamic)
如果不需要编译时类型检查,可以直接将Setup方法的参数改为dynamic类型,这样自有库无需引用外部Feed类,主应用直接传入实例即可。
自有库代码:
public override void Setup(dynamic feed) { SetTitle(feed.title); SetText(feed.text); SetDate(feed.CreationTime); SetSubTitle(feed.subtitle); SetLikes(feed.likes); }
主应用使用代码:
var externalFeed = new Feed(...); yourLibraryInstance.Setup(externalFeed);
注意:这种方式没有编译时校验,若外部Feed类的属性名或类型变更,错误会在运行时才暴露。
3. 拆分参数为独立对象
将外部Feed类所需的属性拆分为自有库内部定义的参数类,让Setup方法接收这个参数类,完全隔离对外部类型的依赖。
自有库代码:
// 自有库定义的Setup参数类 public class FeedSetupParams { public string Title { get; set; } public string Text { get; set; } public DateTime CreationTime { get; set; } public string SubTitle { get; set; } public int Likes { get; set; } } public override void Setup(FeedSetupParams setupParams) { SetTitle(setupParams.Title); SetText(setupParams.Text); SetDate(setupParams.CreationTime); SetSubTitle(setupParams.SubTitle); SetLikes(setupParams.Likes); }
主应用转换代码:
var externalFeed = new Feed(...); var setupParams = new FeedSetupParams { Title = externalFeed.title, Text = externalFeed.text, CreationTime = externalFeed.CreationTime, SubTitle = externalFeed.subtitle, Likes = externalFeed.likes }; yourLibraryInstance.Setup(setupParams);
内容的提问来源于stack exchange,提问作者S.A.Parkhid
相关产品推荐
相关产品推荐

