【问题标题】:Removing dependency on nuget package by using an interface?使用接口删除对 nuget 包的依赖?
【发布时间】:2019-01-30 11:02:02
【问题描述】:

我正在构建一个供多个应用程序使用的新 NuGet 包。这个包做了很多东西和一些 JSON 工作,所以最初我使用了 newtonsoft.json 包。但是,我发现我工作的公司内部的许多应用程序使用不同版本的 newtonsoft.json,或者它们完全使用不同的库来处理 JSON。

为了消除对 newtonsoft.json 的依赖,我创建了一个需要用户实现的接口。它有一个类,如下所示:

public interface IJsonConverter
{
    // this function needs to convert the object to a JSON string
    string SerializeObject(object data);

    // this function returns an object for the supplied JSON string
    T DeserializeObject<T>(string value);
}

每个应用程序都可以很容易地实现,例如:

public class JsonConverter:IJsonConverter
{
    public string SerializeObject(object data)
    {
        return JsonConvert.SerializeObject(data);
    }
    public T DeserializeObject<T>(string value)
    {
        return JsonConvert.DeserializeObject<T>(value);
    }
}

这意味着使用我的 nuget 包的每个应用程序都不必担心这种依赖关系,也不必搞乱绑定重定向或陷入 DLL 地狱。

这种方法会导致更多问题吗?它是反模式吗?有没有更好的方法?

【问题讨论】:

  • 你的 nuget 包会依赖 Newtonsoft 吗?
  • 如果没有 Json 序列化属性,你的生活会很艰难,所以......
  • 确实这是一个选项,您可能能够删除对 Newtonsoft.JSON 库的依赖...无法查看这种方法是否良好(解决您的问题)...如果您对这种方法会使问题的范围更广/更容易回答。
  • 如果每个应用有不同的 json 序列化器,那么使用接口是正确的方法。这就是接口的用途。
  • 如果 your nuget 包正在做一些 JSON 工作,你是怎么做的?还是您的 JSON 工作是抽象的,客户端需要实现它?或者你只是在你的包中暴露一个接口?

标签: c# dependencies nuget


【解决方案1】:

Rocklan,您正在创建一个抽象。抽象通常比实现更好地编写代码。如果这意味着有人必须担心实现,那就这样吧,但我认为抽象对您上游有好处,这意味着您可以在其他任何地方引用您的抽象。

然而,具体的实现真的很重要,因为我认为例如外壳已经翻转。

几乎每个人都在使用 Newtonsoft.Json,但是版本实在是太多了,而且我无法开始使用 Azure Functions 和那个 lib :)

【讨论】:

    猜你喜欢
    • 2021-02-23
    • 1970-01-01
    • 2020-02-20
    • 2019-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-18
    • 2022-12-01
    相关资源
    最近更新 更多