在生成代码中覆盖BCL类的构造函数

时间:2017-05-10 19:48:53

标签: c# dependency-injection swagger x509certificate .net-4.6

我有一些由NSwagStudio生成的代码。这并不重要,因为这可能适用于任何生成的代码。它实际上是一个不想操纵生成的代码的问题,以防由于API,架构更改等而必须重新生成。无论如何,我有一些看起来像这样的代码

var client_ = new System.Net.Http.HttpClient();

这不是由生成的类共享的。每种方法都是新的。问题是我似乎无法找到一种方法让它将客户端证书发送到服务器而不操纵生成的代码并用

替换上面的行
var x509Store = new X509Store(StoreLocation.LocalMachine);
x509Store.Open(OpenFlags.ReadOnly);
var x509Certificate = x509Store.Certificates.Find(
    X509FindType.FindBySubjectName, "MyClientCertName", true
    )[0];
var webRequestHandler = new WebRequestHandler();
webRequestHandler.ClientCertificates.Add(x509Certificate);
var client_ = new System.Net.Http.HttpClient(webRequestHandler);

必须在调用Web服务的每个方法中完成此操作。不是很多,但足以令人讨厌。另外,如果重新生成代码,我或其他开发人员必须记住修改它。

我围绕可能的解决方案摧毁了我的大脑,例如System.Net.HttpClient的扩展构造函数;一些如何在部分类或包装类中做某事。我并没有真正想出任何可行或有效的解决方案。

我没有很多依赖注入的经验,但也许这是它的候选者?不知何故,如果我能告诉.NET,我有这个客户端证书,并且每当你打电话给服务X我总是希望你传递它。我可以这样做,如果我存储我的处理程序,并以某种方式告诉编译器总是将它传递给构造函数,如果使用参数less构造函数。

有什么想法或想法吗?

1 个答案:

答案 0 :(得分:0)

我对Swagger一无所知,但我可以告诉你,依赖注入不是神奇的,更重要的是,它不适用于运行时配置这样 - 它意味着在启动时撰写应用程序。

你应该在Swagger中寻找一种方法来生成你需要的确切代码(推荐)或者在生成代码之后挂钩到某个事件,这样你就可以自动化改变生成代码的过程。 T4 template选项看起来很有希望。