1

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

如果有一个好主意可以自动找出所有这些垃圾,那就太好了。请提出您的精彩想法。谢谢。

4

1 回答 1

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();
    }
}
于 2013-10-30T19:38:14.620 回答