我有一些IoC容器(哪一个没关系,但我们假设它是Autofac)。在我的解决方案中,我有30多个需要注册的服务。所有服务都驻留在名为服务的同一程序集中,每个类的名称格式为 {specific_name} Service.cs 。
由于某些原因,我想避免以这种方式手动注册每项服务:
container.Register<OneService>().AsSelf();
container.Register<TwoService>().AsSelf();
...
container.Register<ThirtyFourService>().AsSelf();
以这种方式注册我的类型:
Type[] serviceTypes = Assembly.Load("Services")
.GetTypes()
.Where(t => t.Name.EndsWith("Service"))
.ToList();
foreach(Type serviceType in serviceTypes)
{
container.Register(serviceType).AsSelf();
}
所有我想要的是简约的注册过程,它允许我添加或删除服务并保持源代码清洁。我的应用程序的初始化可能很慢(服务器端应用程序),但是当第一个请求到来时,它必须尽可能快地行动(性能在提供响应时确实很重要)。说初始化我的意思是注册类型,读取配置文件等。
这样的反射使用会“在运行时”减慢我的应用程序速度还是仅影响应用程序初始化?以后如何解决依赖关系?
答案 0 :(得分:1)
假设您一旦注册就不会对请求产生影响 - 注册(.Register<TwoService>().AsSelf()
和.Register(typeof(TwoService)).AsSelf()
)的两种方式都应该完全相同。您可以检查自己选择的容器,只需要另一个容器。
请注意,根据您使用的容器,可能存在注册的所有方式&#34;匹配模式的所有类型&#34;。即Unity已经&#34;注册&#34;所有类型 - 所以根本不需要Register<ConcreteType>()
。
答案 1 :(得分:0)
在AutoFac中,有两种方法可以控制请求的生命周期: InstancePerHttpRequest 或 InstancePerApiRequest 。
但是,如果您使用InstancePerHttpRequest或InstancePerApiRequest,它将基本上是相同的,您将需要解析您的类的所有服务并注册它们。我不认为你的应用程序会更昂贵,因为有些扩展正在做同样的事情。例如。 AutoFac,如AutoFac for MVC 5或Autofac for web Api。
所以,如果你不关心几毫秒的性能,你可以去做。
答案 2 :(得分:0)
我认为它仍然在为每个服务使用Activator.CreateInstance,所以那里有一个小问题,以及明显的反射发现服务。从容器的角度来看,我认为您无需担心性能问题。如果由于某种原因你遇到问题,请检查另一个容器以获得更好的性能,因为这是一个常见的用例,应该得到很好的支持和广泛支持。