You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为外部库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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 08:15:44