1
想知道是否有一种很好的方法来查找Autofac模块中的垃圾配置。我的意思是,虽然项目越来越多,并且进行了大量重构,可能会有一些类未使用,但它们仍在模块配置中注册。那些垃圾类可以从Reshaper隐藏,因为它在配置代码中使用。我只是不喜欢遍历配置代码中的每一行,以查找是否再也不使用接口或类,并手动删除它们。清洁垃圾Autofac配置?
如果有好的想法自动找出所有这些垃圾将会很好。请抛出你的精彩想法。谢谢。
想知道是否有一种很好的方法来查找Autofac模块中的垃圾配置。我的意思是,虽然项目越来越多,并且进行了大量重构,可能会有一些类未使用,但它们仍在模块配置中注册。那些垃圾类可以从Reshaper隐藏,因为它在配置代码中使用。我只是不喜欢遍历配置代码中的每一行,以查找是否再也不使用接口或类,并手动删除它们。清洁垃圾Autofac配置?
如果有好的想法自动找出所有这些垃圾将会很好。请抛出你的精彩想法。谢谢。
您可以从您的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();
}
}
感谢您的回答。但我认为这个问题在那里依然存在。在项目的某个阶段,它可能在测试代码中有“container.Resolve()”。在从生产代码中删除MyNotUsedClass的使用后,测试仍将通过。 –
bigbearzhu
@bigbearzhu因此,运行测试以获取所有使用的注册不适合您,请尝试其他方式。 –