У меня есть следующий тестAutofac игнорирует регистрацию конфликтов
[TestFixture]
public class Test
{
public interface IMy { }
class MyClass : IMy { }
class MyClass2 : IMy { }
[Test]
public static void Go()
{
var builder = new ContainerBuilder();
builder.RegisterType<MyClass>().AsImplementedInterfaces();
builder.RegisterType<MyClass2>().AsImplementedInterfaces();
var container = builder.Build();
var resolved = container.Resolve<IMy>();
Console.WriteLine(resolved);
}
}
Почему это не выбрасывает исключение при реализации, очевидно, в конфликте? И как заставить это бросать исключение, если такой конфликт найден?
UPDATE Решение с проверкой регистрации почти Ok, но там просто ситуация, когда не удается:
[TestFixture]
public class Test
{
public interface IPlugin
{
}
public interface IMy
{
}
class MyClass : IMy, IPlugin
{
public void Dispose()
{
}
}
class MyClass2 : IPlugin
{
public void Dispose()
{
}
}
public class SingleRegistrationModule : Module
{
protected override void AttachToComponentRegistration(
IComponentRegistry componentRegistry,
IComponentRegistration registration)
{
foreach (var service in registration.Services)
{
var registrations = componentRegistry.RegistrationsFor(service);
if (registrations.Count() > 1)
{
throw new Exception(
"Can't register '{registration.Activator.LimitType}' as '{service}'" +
" because '{registrations.First().Activator.LimitType}' is already registered");
}
}
}
}
[Test]
public static void Go()
{
var builder = new ContainerBuilder();
builder.RegisterType<MyClass>().AsImplementedInterfaces();
builder.RegisterType<MyClass2>().AsImplementedInterfaces();
builder.RegisterModule<SingleRegistrationModule>();
var container = builder.Build();
var resolved = container.Resolve<IMy>();
Console.WriteLine(resolved);
}
}
В этом случае никто не решает IInitializable поэтому допустимо иметь несколько реализаций. Кроме того, существуют сценарии, когда реализация mulltiple в порядке, например, IPluginToSomething
Я полностью согласен с вами, и я также попытался разрешить сбор, но как отменить это ошибочное поведение по умолчанию? –
@AlexIlyin: Я не думаю, что вы можете легко переопределить это, но, возможно, гуру Autofac может ответить на это. – Steven