隐藏API中的公共类c#

时间:2014-08-29 22:01:53

标签: c# api serialization polymorphism encapsulation

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

我显然希望封装代码,以便他们无法窃取我们所有的辛勤工作。我面临的问题是我们所有的类都必须是公共类才能序列化和反序列化。我已经尝试将它们标记为内部,但XMLSerializer总是出错。

我希望能够做的是给他们一个暴露API的公共8方法的dll,而不是公开库的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访问。我怎么处理这个? 提前致谢

1 个答案:

答案 0 :(得分:1)

您可以隐藏类以使API更简单,以便消费者需要了解的类更少。但是,正如迈克指出的那样,这不会阻止有反编译器的人分析你的源代码。为此,您需要一个混淆器。

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