关于如何在另一个库中调用库的方法的建议

时间:2015-11-23 10:13:55

标签: c#

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

[编辑]

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

2 个答案:

答案 0 :(得分:1)

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

你可以使用这样的东西

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

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

答案 1 :(得分:0)

依赖注入是您问题的最佳选择: 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。 Logger在控制台应用程序中实现:

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