2013-08-16 46 views
0

我已经写了下面这段代码,并且正在寻求改进它。使用Unity DI,我需要注册具体的类以及它们实现的接口。该方法的优点是消除了添加注册新类的需求。将接口映射到具体类

我的代码减少到

 

    IUnityContainer container = new UnityContainer(); 
      // from 
      // Factories 
      // container.RegisterType(); 

      // Services 
      // container.RegisterType(); 
      // container.RegisterType(); 
      //...... 
      // to 

    var assemblies = AppDomain.CurrentDomain.GetAssemblies() 
     .Where(x => x.GetName().Name.Contains("Romabravo.ApplicationManager")); 

    foreach (var assembly in assemblies) 
    { 
     var types = assembly.GetExportedTypes(); 
     foreach (Type t in types) 
     { 
      var interfaces = t.GetInterfaces().Where(x => x.FullName != null && 
      x.FullName.Contains("Romabravo.ApplicationManager")).ToList(); 

       foreach (var item in interfaces) 
       { 
        var interfaceImplementers = AppDomain.CurrentDomain.GetAssemblies() 
        .SelectMany(s => s.GetTypes()) 
        .Where(p => item.GetTypeInfo().IsAssignableFrom(p) && 
        item.FullName.Contains("Romabravo.ApplicationManager")) 
        .Select(x => x).Where(x => !x.IsInterface && !x.IsAbstract).ToList(); 

        if (interfaceImplementers != null) 
        { 
         foreach (var implementer in interfaceImplementers) 
         { 
          container.RegisterType(item, implementer); 
         } 
        } 
       } 
      } 
     } 

    return container; 


只是在寻找一种方式,以进一步优化它。

回答

2

如果您在使用Unity 3那么你可以使用registration by convention这可以简化代码位:

container.RegisterTypes(
    AllClasses.FromLoadedAssemblies() 
     .Where(a => a.FullName.Contains("Romabravo.ApplicationManager")), 
    WithMappings.FromMatchingInterface);