【问题标题】:How can various classes use only one instance of a logfile class各种类如何只使用日志文件类的一个实例
【发布时间】:2019-10-22 04:35:15
【问题描述】:

我正在开发 C# 脚本 ConsoleApp,并添加了一些 dll 类型的项目。 该脚本的概述是这样的-该脚本将基本上连接到外部 ActiveDirectory 并在给定的 OU 上进行搜索。从该 OU 获取所有用户的列表,然后通过 Microsoft Graph API 连接并执行 1) 邀请 B2B 用户和 2) 在 AzureAD 中更新这些受邀用户的一些属性。

我的解决方案有几个项目。

  1. ConsoleApp -(这是程序的开始)
  2. Lo​​gicLayer - DLL。这是主要逻辑所在。比如哪些用户是 AD 中的新用户,哪些用户要从 Azure 中删除等。
  3. DALActiveDirectory - DLL。这是脚本连接到 AD 并将数据返回给 LogicLayer 的地方。
  4. DALGraphAPI - DLL。这是脚本将连接到 GraphAPI 的地方。包含获取所有用户、通过Id获取用户、更新用户属性等功能。这里的方法主要是从LogicLayer调用的。
  5. 密码加密 - Dll。包含从文件中检索加密文本并对其进行解密以获取密码的功能。 DALGraphAPI 和 DALActiveDirectory 都使用各自的密码。
  6. Lo​​gFile - dll 我在这里定义了一个类来创建一个日志文件,其名称采用时间戳格式。例如“Log-yyyy_MM_dd_HH_mm_ss_ffff.txt”。

现在我想使用 LogFile 实例来记录某些事情(例如错误、一些调试消息),因为控制从 ConsoleApp 传递到 LogicLayer 再到 DALActiveDirectory 到 PasswordCrypto ...等等。但是,我只想要这个 LogFile 类的一个实例。并且无论控件在哪里,应用程序都应该使用那个实例来记录到那个日志文件。如果我在每个班级都这样做:

LogFile logFile = new LogFile();

然后,它会创建一个新的日志文件(由于时间戳而具有新名称)。我希望每次完整运行控制台应用程序只创建一个日志文件。我怎样才能做到这一点?一种方法是在 ConsoleApp(即启动项目)中创建一个实例,然后将其传递给其他类。我认为它会起作用,但不是非常优雅的解决方案。我在互联网上读过一些叫做单例模式的东西,但不确定它是否适用于此。

有什么建议吗?

【问题讨论】:

  • 我没有看到问题,你不是只是从其他项目中引用日志项目(dll)吗?确保为记录器创建一个单例类并正常使用。
  • 你在使用依赖注入吗?如果是这样,您可以将您的记录器注册为单例并在需要的地方注入它。这与将类实际定义为单例不同。我会避免这种情况。如果你还没有搞砸依赖注入,我推荐它。它为此类问题提供了一个优雅的解决方案。它往往也会让其他很棒的事情发生。听起来我在卖它,就像它可以治愈所有疾病一样,我会从中赚钱。它不是那么棒。但这真的很棒。

标签: c# oop design-patterns singleton static-methods


【解决方案1】:

这是一个单例模式的示例。


 Private Shared objLoggerTool As LoggerTool

    Public Shared Function GetLoggerToolInstance(ByVal strLogPath As String, ByVal iLogLevel As Integer) As LoggerTool
        If (objLoggerTool Is Nothing) Then
            objLoggerTool = New LoggerTool(strLogPath, iLogLevel)
        End If
        Return objLoggerTool
    End Function


you instantiate the logger as

        'instantiate the logger 
        _loggerTool = LoggerTool.GetLoggerToolInstance(config.LogFilePath, config.LogLevel)

这是我做的一个应用程序中的一个 vb.net 示例,但它应该可以帮助您了解如何创建记录器并使用它。

【讨论】:

    猜你喜欢
    • 2011-09-05
    • 1970-01-01
    • 2011-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多