gpt4 book ai didi

c# - 如何注册所有类型的接口(interface)并统一获取它们的实例?

转载 作者:太空狗 更新时间:2023-10-29 18:05:53 26 4
gpt4 key购买 nike

unity如何获取一个接口(interface)的所有实例,然后访问它们?

代码片段取自这里:Fail-Tracker

在 StrcutureMap 中,可以从程序集中注册所有类型的接口(interface),然后像下面这样访问它们:

public class TaskRegistry : Registry
{
public TaskRegistry()
{
Scan(scan =>
{
scan.AssembliesFromApplicationBaseDirectory(
a => a.FullName.StartsWith("FailTracker"));
scan.AddAllTypesOf<IRunAtInit>();
scan.AddAllTypesOf<IRunAtStartup>();
scan.AddAllTypesOf<IRunOnEachRequest>();
scan.AddAllTypesOf<IRunOnError>();
scan.AddAllTypesOf<IRunAfterEachRequest>();
});
}
}


ObjectFactory.Configure(cfg =>
{

cfg.AddRegistry(new TaskRegistry());

});

然后访问实现这些接口(interface)的所有类型,例如:

        using (var container = ObjectFactory.Container.GetNestedContainer())
{
foreach (var task in container.GetAllInstances<IRunAtInit>())
{
task.Execute();
}

foreach (var task in container.GetAllInstances<IRunAtStartup>())
{
task.Execute();
}
}

这段代码在 unity 中的等价物是什么?

我怎样才能像结构图一样在 Application_BeginRequest 得到这些

public void Application_BeginRequest()
{
Container = ObjectFactory.Container.GetNestedContainer();

foreach (var task in Container.GetAllInstances<IRunOnEachRequest>())
{
task.Execute();
}
}

最佳答案

添加了 Unity 3 registration by convention进行批量注册。

此外,Unity 有注册一个未命名映射和许多命名映射的概念。调用 Resolve() 或其重载之一时,将解析未命名的映射。调用 ResolveAll() 或其重载之一时,将解析所有命名映射(而不是未命名映射)。

// There's other options for each parameter to RegisterTypes()
// (and you can supply your own custom options)
container.RegisterTypes(
AllClasses.FromLoadedAssemblies().
Where(type => typeof(IRunOnEachRequest).IsAssignableFrom(type)),
WithMappings.FromAllInterfaces,
WithName.TypeName,
WithLifetime.Transient);

foreach (var task in container.ResolveAll<IRunOnEachRequest>())
task.Execute();

关于c# - 如何注册所有类型的接口(interface)并统一获取它们的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23325902/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com