如何注册所有类型的接口并统一获取它们的实例?

时间:2014-04-27 16:28:37

标签: c# unity-container structuremap

Unity如何获取接口的所有实例然后访问它们?

代码片段取自此处:Fail-Tracker

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

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();
            }
        }

这个代码在统一中的等价物是什么?

我如何在Application_BeginRequest中获得这些结构图

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

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

1 个答案:

答案 0 :(得分:23)

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();