【问题标题】:method XXX is inaccessible due to its protection level方法 XXX 由于其保护级别而无法访问
【发布时间】:2016-09-14 07:03:52
【问题描述】:

我有一个奇怪的问题。我使用 Unity 作为 IOC/DI。我想创建类 LoggerService 的实例,但错误出现 'LoggerService.LogException(System.Exception, string, string)' 由于其保护级别'而无法访问'。我有几个 Unity 使用的类,它们具有内部访问修饰符(类没有访问修饰符),并且可以在代码中访问。为什么它在这里不起作用?

我的代码如下:

//console app executable module:
 static void CommonOnUnhandledException(Exception exception, string messagePrefix) 
        {
            var logger = Ioc.Resolve<LoggerService>(Config);
            logger.LogException(exception, String.Empty, String.Empty);
            Console.WriteLine(String.Format("{0} unhandled exception: {1}; {2}", messagePrefix, exception.Message, exception.StackTrace));
        }

//library Services.dll
class LoggerService : ILoggerService 
    {


        public LoggerService(AppConfiguration configuration)
        {
            ...
         }
        public void LogException(Exception ex, string url = "", string messageContent = "")
        {
...

        }
}

//library services dll, started in console app
 public static class ServicesModule
    {
        public static void Init(UnityContainer container)
        {
            // register all other ordinary types:
            container.RegisterType<IIntelShopService, IntelShopService>(new ContainerControlledLifetimeManager());
            container.RegisterType<IBackendService, BackendService>(new ContainerControlledLifetimeManager());
            container.RegisterType<IIntelODataService, IntelODataService>(new ContainerControlledLifetimeManager());
            container.RegisterType<ILoggerService, Log4NetLoggerService>(new ContainerControlledLifetimeManager());
            container.RegisterType<IPerformanceTrackerService, PerformanceTrackerService>(new ContainerControlledLifetimeManager());

        }
    }

【问题讨论】:

  • LoggerService 默认是内部的,只能在 dll 内部访问。
  • IM 询问 IOC 的问题,而不是没有 IOC 的解决方案!!!

标签: c# unity-container


【解决方案1】:

你必须让你的班级public。始终对方法、属性和类使用修饰符很有用。

【讨论】:

    【解决方案2】:

    您可以尝试解析 ILoggerService 而不是特定的实现。

    如果您解析具体类型而不是接口,则通常只使用统一或依赖注入/控制反转功能的一半。

    顺便说一句:实现应该大部分时间是internal,而另一方面,接口往往是public

    【讨论】:

    • 这也是我昨天发现的;)。
    【解决方案3】:

    你必须让你的班级public。如果没有修饰符,默认值为internal,对于您的目的而言,它不够“可见”。另见here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-26
      • 2011-09-01
      • 1970-01-01
      • 2011-04-02
      • 2011-02-07
      • 2012-01-25
      相关资源
      最近更新 更多