【发布时间】: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