【问题标题】:Hiding public classes in an API c#在 API c# 中隐藏公共类
【发布时间】:2014-08-29 22:01:53
【问题描述】:

我最近完成了一个使用 xmlserializer 和泛型来解码 API 的项目。然后我们处理数据并将其呈现为我们的应用程序使用的另一个 API。我们正在考虑让镇上的其他几家公司使用该 API,因为它们运行与我们相同的软件。

我显然想封装代码,这样他们就不会窃取我们所有的辛勤工作。我面临的问题是我们所有的类都必须是公共类才能序列化和反序列化。我尝试将它们标记为内部,但 XMLSerializer 总是出错。

我想做的是给他们一个 dll,它公开 API 的 8 个公共方法,而不是公开库的 30 个公共类。

我目前的工作方式如下: 引用 API 的客户端应用 引用库的 API。这包含了 8 个公共方法。 包含所有类和序列化库的库。

问题是客户端需要访问库中的类,或者我必须在 API 上编写转换方法和从方法转换(我已经这样做了,但感觉很脏) 一些代码。这是一个经过序列化然后反序列化的公共类,因此标记为公共

public class Ping
{                

    public class Request
    {
        public string methodName = "Ping";            
    }


    public class Response
    {
        public String methodName { get; set; }
        public int methodErrorCode { get; set; }
        public String methodErrorMessage { get; set; }
    }


    private Method<Request, Response> ping;


    public Ping(Credentials auth)
    {
        ping = new Method<Request, Response>(auth);
    }


    public bool isAlive()
    {  
        /* send the request directly as there are no variables in the ping request that need to be set */
        ping.post();

        /* analyze the response */
        return ping.response.methodResponse.methodErrorMessage.Equals("Pong") ? true : false;
    }

}

大约有 30 个这样的类都需要标记为公共以进行序列化,但不应通过 API 访问。我该如何处理? 提前致谢

【问题讨论】:

  • 访问修饰符并非旨在保护您的内部结构免受检查。任何人都可以使用 Reflector 或 ILSpy 将 IL 反编译为 C#。它们旨在让您声明您支持的内容和未来的工作方式,以及什么是实施细节,不应依赖。
  • 感谢迈克指出这一点。希望使用它的人不会深入到他们想做的事情。更多的是为了让用户不那么复杂,但向他们隐藏我们的代码也很重要

标签: c# api serialization polymorphism encapsulation


【解决方案1】:

您可以隐藏类以使您的 API 更简单,从而减少消费者需要注意的类。但是,正如 mike z 指出的那样,这不会阻止使用反编译器的人分析您的源代码。为此,您需要一个混淆器。

无论哪种方式,您都可以创建另一个库(即 PublicLibrary),它位于您现在拥有的库(即 CurrentLibrary)之上并创建一个外观。 CurrentLibrary 中的类仍将是公开的(但如果您选择,则会被混淆)。但是,消费者可以使用 PublicLibrary,并且不需要接触 CurrentLibrary 中的 30 个无关类。

例如:

//PublicLibrary.dll 
public class PublicExampleClass
{
   public string SomeMethod()
   {
       //simplify CurrentLibrary
       return new CurrentLibrary.Serializer()
           .SerializeCurrentLibrayrObject(new CurrentLibraryObject());
   }
}

//CurrentLibrary.dll
public class Serializer
{
    public string SerializeCurrentLibrayrObject(CurrentLibraryObject obj){
       //Serialize obj
    }
}

【讨论】:

  • 这就是我提出问题后所做的。问题是我在当前库中有一个需要由客户端使用的类,这意味着我必须发送 2 个 dll 或使用售后软件合并它们。我接受作为答案,因为我认为这是处理它的最佳方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-02
  • 1970-01-01
  • 1970-01-01
  • 2015-02-18
  • 2015-03-27
  • 2013-06-03
  • 1970-01-01
相关资源
最近更新 更多