隐藏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更简单,这样消费者需要知道的类就更少了。然而,正如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
}
}