如何在Unity中注册所有类型的接口并获取它们的实例?

8
如何在Unity中获取所有接口实例并访问它们?
代码片段来自于这里:Fail-Tracker 在StructureMap中,可以注册程序集中所有接口类型,然后像以下代码一样访问它们:
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());

        });

然后可以访问实现这些接口的所有类型,例如:

        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中使用StructureMap获取它们?

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

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

23

Unity 3加入了“按约定注册”的功能,以进行大量的注册。

此外,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();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接