繁体   English   中英

反射与参考-IoC容器注册

[英]Reflection vs reference - IoC container registering

我有一些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();
}

我想要实现的只是一个简约的注册过程,该过程使我可以添加或删除服务并保持源代码的清洁。 我的应用程序初始化可能很慢(服务器端应用程序),但是当第一个请求到来时,它必须表现得尽可能快(在响应响应时性能确实很重要)。 说初始化是指注册类型,读取配置文件等。

这样的反射用法是否会使我的应用程序“在运行时”变慢,或者只是影响应用程序的初始化? 以后如何解决依赖关系?

假设您一次注册就不会对请求产生影响-两种注册方式( .Register<TwoService>().AsSelf()和本质上是.Register(typeof(TwoService)).AsSelf() )应该做的完全相同。 您可以检查自己是否选择了一个简单地调用另一个的容器。

请注意,根据您使用的容器,可能存在注册“所有类型匹配模式”的方法。 即Unity已经“注册”了所有类型-因此根本不需要Register<ConcreteType>()

在AutoFac中,有两种方法可以控制请求的生存期: InstancePerHttpRequestInstancePerApiRequest

但是,如果使用InstancePerHttpRequest或InstancePerApiRequest基本上是同一回事,则需要解析该类的所有Services并注册它们。 我认为对于您的应用程序来说,这不会太昂贵,因为某些扩展在做同样的事情。 例如AutoFac,例如MVC 5的AutoFac或Web Api的Autofac。

因此,如果您不关心几毫秒的性能,则可以选择。

我可以想象它仍在为每个服务使用Activator.CreateInstance,所以在那里有一个小小的打击,还有明显的反射发现服务。 从容器的角度来看,我认为您不必担心性能方面的问题。 如果由于某种原因确实遇到问题,请检查另一个容器以获得更好的性能,因为这是一个常见的用例,应该得到很好的广泛支持。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM