隐藏API c#中的公共类

本文关键字:API 隐藏 | 更新日期: 2023-09-27 18:19:58

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

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

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

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

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

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访问。我该怎么处理?提前感谢

隐藏API c#中的公共类

您可以隐藏类以使API更简单,这样消费者需要知道的类就更少了。然而,正如mikez所指出的,这不会阻止有反编译器的人分析你的源代码。为此,您需要一个模糊处理程序。

无论哪种方式,您都可以创建另一个库(即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
    }
}