2013-10-30 58 views
1

想知道是否有一种很好的方法来查找Autofac模块中的垃圾配置。我的意思是,虽然项目越来越多,并且进行了大量重构,可能会有一些类未使用,但它们仍在模块配置中注册。那些垃圾类可以从Reshaper隐藏,因为它在配置代码中使用。我只是不喜欢遍历配置代码中的每一行,以查找是否再也不使用接口或类,并手动删除它们。清洁垃圾Autofac配置?

如果有好的想法自动找出所有这些垃圾将会很好。请抛出你的精彩想法。谢谢。

回答

1

您可以从您的container.ComponentRegistry.Registrations属性中获取所有注册信息。然后,您可以将您的代码附加到所有注册的激活生存期事件中,以便获得所有已解决的类型。然后,您应该运行/测试您拥有的所有功能(或解析所有控制器),以便解决所有依赖关系。然后,您可以比较注册的类型和解决的类型。请注意运行此代码的问题,例如性能影响,多线程问题。这里有一个简单的工作示例,请随时改进:

class Program 
{ 
    internal class MyUsedClass : IMyUsedClass {} 
    internal interface IMyUsedClass {} 
    internal class MyUsedClass2 {} 
    internal class MyNotUsedClass {} 

    static void Main(string[] args) 
    { 
     // register your modules and types 
     var builder = new ContainerBuilder(); 
     builder.RegisterType<MyUsedClass>().As<IMyUsedClass>(); 
     builder.RegisterType<MyUsedClass2>(); 
     builder.RegisterType<MyNotUsedClass>(); 

     using (var container = builder.Build()) 
     { 
      // get all registered types 
      var typesRegistered = new HashSet<Type>(); 
      foreach (var type in container.ComponentRegistry.Registrations.SelectMany(r => r.Services.Select(s => (s as IServiceWithType).ServiceType))) 
      { 
       typesRegistered.Add(type); 
      } 


      // get all resolved types via lifetime events 
      // please be aware of performance impact, multithreading, etc 
      var typesResolved = new HashSet<Type>(); 
      foreach (var registration in container.ComponentRegistry.Registrations) 
      { 
       registration.Activating += 
        (sender, eventArgs) => 
        { 
         foreach (var type in eventArgs.Component.Services.Select(s => (s as IServiceWithType).ServiceType)) 
         { 
          typesResolved.Add(type); 
         } 
        }; 
      } 

      // application is working 
      container.Resolve<IMyUsedClass>(); 
      container.Resolve<MyUsedClass2>(); 

      // Types that are registered but were not resolved. 
      foreach (var type in typesRegistered.Where(type => !typesResolved.Contains(type))) 
      { 
       Console.WriteLine("Registered But Not Resolved: {0}",type); 
      } 
     } 

     Console.ReadKey(); 
    } 
} 
+0

感谢您的回答。但我认为这个问题在那里依然存在。在项目的某个阶段,它可能在测试代码中有“container.Resolve ()”。在从生产代码中删除MyNotUsedClass的使用后,测试仍将通过。 – bigbearzhu

+0

@bigbearzhu因此,运行测试以获取所有使用的注册不适合您,请尝试其他方式。 –