ServiceRegistrator
class ServiceRegistrator
using System;
using System.Linq;
namespace Stashbox.Registration
{
internal class ServiceRegistrator
{
public void Register(IContainerContext containerContext, ServiceRegistration serviceRegistration, Type serviceType)
{
if (serviceRegistration.RegistrationContext.AdditionalServiceTypes.Length > 0) {
foreach (Type item in serviceRegistration.RegistrationContext.AdditionalServiceTypes.Distinct()) {
if (item.IsOpenGenericType())
RegisterInternal(containerContext, serviceRegistration, item.GetGenericTypeDefinition());
else
RegisterInternal(containerContext, serviceRegistration, item);
}
}
RegisterInternal(containerContext, serviceRegistration, serviceType);
}
private void RegisterInternal(IContainerContext containerContext, ServiceRegistration serviceRegistration, Type serviceType)
{
if (serviceRegistration.IsDecorator) {
containerContext.DecoratorRepository.AddDecorator(serviceType, serviceRegistration, false);
containerContext.RootScope.InvalidateDelegateCache();
} else if (containerContext.RegistrationRepository.AddOrUpdateRegistration(serviceRegistration, serviceType)) {
containerContext.RootScope.InvalidateDelegateCache();
}
}
public void ReMap(IContainerContext containerContext, ServiceRegistration serviceRegistration, Type serviceType)
{
if (serviceRegistration.RegistrationContext.AdditionalServiceTypes.Length > 0) {
foreach (Type item in serviceRegistration.RegistrationContext.AdditionalServiceTypes.Distinct()) {
ReMapInternal(containerContext, serviceRegistration, item);
}
}
ReMapInternal(containerContext, serviceRegistration, serviceType);
}
private void ReMapInternal(IContainerContext containerContext, ServiceRegistration serviceRegistration, Type serviceType)
{
if (serviceRegistration.IsDecorator)
containerContext.DecoratorRepository.AddDecorator(serviceType, serviceRegistration, true);
else
containerContext.RegistrationRepository.AddOrReMapRegistration(serviceRegistration, serviceType);
containerContext.RootScope.InvalidateDelegateCache();
}
}
}