清洁垃圾Autofac配置?

时间:2013-10-30 04:59:10

标签: configuration autofac

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

如果有好主意自动找出所有垃圾,那就太好了。请投入你的精彩想法。感谢。

1 个答案:

答案 0 :(得分: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();
    }
}