【问题标题】:Suggestion on how to call a method of a library in another library关于如何在另一个库中调用一个库的方法的建议
【发布时间】:2016-02-25 09:42:45
【问题描述】:

我正在寻找一种方法来做我想做的一件事,我希望这里的任何人都可以帮助我。这是我的场景:我有两个库,第一个执行一些操作,第二个是一个简单的记录器。在第一个库中,我有一个对数据库进行一些操作的 winform,用户可以使用此表单添加或删除数据;我想使用第二个库来记录用户所做的所有操作,但不引用第一个库中的日志库。我正在寻找的是一种让主应用程序知道用户在第一个库中做了什么然后调用第二个库在日志中写入一些数据的方法。要记住的另一件事是第一个库中的表单作为对话框表单打开。有可能吗?如果是,我该怎么做?提前致谢。

[编辑]

我意识到,也许我的问题并不像我想的那么清楚。为了使两个库分开(我不想以任何方式从第一个库调用日志库),我正在考虑第一个库中引发事件或类似或其他东西的东西应用程序,因此如果需要,我可以在需要时从主应用程序调用第二个库中的日志记录方法。我希望这更清楚。

【问题讨论】:

  • 只需添加第二个项目作为对第一个项目的引用..
  • 看看我添加到答案中的示例。
  • 我得到了适合我的情况的解决方案:因为我不想向数据库库添加任何日志记录方法,所以我在 winform 中创建了一些自定义事件,所以当我按下按钮时在主应用程序中形成一个事件,在该事件中我调用日志记录方法。我还在事件中传递了我需要的所有参数,因此我拥有了适合日志所需的所有数据。

标签: c#


【解决方案1】:

依赖注入是解决您问题的最佳选择: http://www.martinfowler.com/articles/injection.html

在这里你可以找到如何为 .net 实现它

https://visualstudiomagazine.com/articles/2010/08/01/inversion-of-control-patterns-for-the-microsoft-net-framework.aspx

一句话:需要在核心库(Core.dll)中定义接口:

interface ILogger
{
   void log(string message);
}

您的 libraryA 指的是 Core.dll,而不是 libraryB。 并在您的库中解析 ILogger 接口

var logger = ServiceContainer.Resolve<ILogger>()

在您的应用程序(指 Core、libraryA、libraryB)中,您应该注册您的记录器:

ServiceContainer.Register(typeof(ILogger),<MyLogger is implemented in AssemblyB or in the main app, implements ILogger interface>);

我已经制作了示例,演示了如何从 PCL 库调用 Logger。记录器在控制台应用程序中实现:

https://github.com/Mogikan/Stackoverflow-samples/tree/master/Logger

【讨论】:

  • 我究竟如何才能引用库 B 中 引用的 MyLogger 类?
  • 这称为依赖注入,它允许您从不知道 MyLogger 及其实现方式的库中的服务容器中获取实现。注入发生在你的应用程序中,它知道如何实现它。
  • 另外一个链接,您可以找到有用的stackoverflow.com/questions/743951/…
  • 这不会编译为类MyLogger 不包含在解决方案中。问题不在于控制反转,而在于使用项目中未包含的库中的内容。
  • 据我所知,应用程序有足够的信息来记录,而库没有。因此,如果实现了记录器,它可以记录,如果它没有在主应用程序中实现,它可能不会记录。因此,MyLogger 可以在 Application 中引用,并且它不应该被库引用,因为它在问题中是必需的。
【解决方案2】:

我只是想知道如果您可以添加对该库的引用,为什么您想要这种更慢、更“黑客”的方式。为什么不使用引用所需库的逻辑方法?尽管如此,使用反射可以在库中使用类和方法,而无需引用该库。

你可以使用这样的东西

Assembly SampleAssembly;
SampleAssembly = Assembly.LoadFrom("c:\\Sample.Assembly.dll");
// Obtain a reference to a method known to exist in assembly.
MethodInfo Method = SampleAssembly.GetTypes()[0].GetMethod("Method1");

来源:https://msdn.microsoft.com/en-us/library/system.reflection.assembly.gettypes(v=vs.110).aspx

请理解使用反射被认为很慢,所以我建议不要在循环或递归代码片段中使用它。

【讨论】:

  • 假设我正在使用 PCL 库,它不了解 android 和 LogCat。我的主要应用是android,它可以实现logger:Android.log()。另一个应用程序是 Windows 商店应用程序,它具有不同的记录器实现等。您如何在 PCL 项目中引用 Mono.Android.dll?答案很简单:使用依赖注入即可。
猜你喜欢
  • 1970-01-01
  • 2019-04-25
  • 1970-01-01
  • 2017-11-03
  • 1970-01-01
  • 2021-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多