【问题标题】:Multiple classes against the same interfaces in Unity ContainerUnity Container 中针对相同接口的多个类
【发布时间】:2014-07-24 08:31:04
【问题描述】:

我有一个跨多个类实现的接口“IRunAtStartup”。该接口有一个“执行”方法,需要在应用程序启动时为所有类执行。

在编译时,我不知道实现该接口的类的数量,因此这确实需要以通用方式编写。

将 Unity 用于 IOC,以下是我尝试过 2 种方法的 2 种方法

1) 抛出运行时错误:

container.RegisterTypes(runAtStartUp, WithMappings.FromAllInterfaces);

2) 在 for 循环内的 register 命令中引发编译错误 - “无法解析类型”。我对 Unity 世界比较陌生,我怀疑我在这里遗漏了一些基本问题。

IEnumerable<Type> runAtStartUp = typeFinder.FindClassesOfType<IRunAtStartup>(true);

foreach (var type in runAtStartUp)
{
    container.RegisterType<IRunAtStartup, type>(type.AssemblyQualifiedName);
}
foreach (var task in container.ResolveAll<IRunAtStartup>())
            {
                task.Execute();
            }

【问题讨论】:

  • 你能发布堆栈跟踪吗?方法 2 对我来说似乎没问题,其中一种类型的注册可能存在问题。
  • 方法 2 甚至无法编译。这是相同的屏幕截图:dl.dropboxusercontent.com/u/11374665/approach-2.JPG
  • 哦。您使用了无效的 C# 语法,错过了这一点。请改用container.RegisterType(typeof(IRunAtStartup), type, type.AssemblyQualifiedName)
  • 效果很好......你想把它作为答案发布,以便我可以将它标记为答案吗?我知道我错过了一些基本的东西,只是没有意识到它是什么......
  • 我已经发布了答案。

标签: c# unity-container ioc-container


【解决方案1】:

方法 2 的想法是正确的(使用命名注册),但是您有 C# 语法错误。使用方法是:

container.RegisterType(typeof(IRunAtStartup), type, type.AssemblyQualifiedName);

【讨论】:

  • 我现在的情况略有不同,但我怀疑我又犯了一个语法错误......你能马上发现什么吗? foreach (var settingClass in typeFinder.FindClassesOfType(true)) { container.Resolve().LoadSetting("domId"); }
  • 这里有一个截图链接。 link感谢您的帮助,@cynic
  • 可以创建右侧方法的非泛型版本——即LoadSettings(Type settingsType, string domainGuid...)。或者您可以使用反射来调用现有的通用版本。您根本无法像以前那样在 C# 中调用泛型方法 - 在 之间是类型名称,在编译时已知,而不是在运行时已知的 System.Type 实例。
  • 感谢您的及时回复。但是,我在使用 autofac 的开源应用程序中看到了类似的东西,这是相同的屏幕截图 link
  • 请注意,TSettings 在这种情况下是一个类型参数。如果泛型约束允许,您可以将类型参数“传递”给另一个泛型方法(即,您编写 LoadSetting&lt;TSettings&gt;() 并编译)。您可以通过typeof(TSettings) 在泛型方法中获取System.Type 实例。您不能做的是使用System.Type 实例调用BuildRegistration&lt;TSettings&gt;LoadSetting&lt;TSettings&gt;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-25
  • 2021-10-18
  • 1970-01-01
  • 1970-01-01
  • 2011-12-15
相关资源
最近更新 更多