Заставьте Autofac вернуть общий реферат, а не конкретный класс - PullRequest
0 голосов
/ 03 февраля 2012

Я пытаюсь выполнить автоматическое подключение моего приложения с помощью Autofac. Все хорошо, кроме того, что у меня есть абстрактный универсальный тип, такой как:

public abstract class Transformer<TModel>
{
  // Some abstract methods
}

С ним реализовано как:

public class EventTransformer : Transformer<Event>
{
  // implementation of methods
}

Я автоматически подключаю приложение:

builder.RegisterAssemblyTypes(typeof (MyAssemblyName).Assembly)
    .InstancePerLifetimeScope();

Затем Autofac выдаст ошибку при разрешении этого типа класса:

public class RandomClass<TModel>
{ 
  public RandomClass(Transformer<TModel> transformer() 
  {
     // Constructor code
  }
}

Я получаю ошибку ниже (упрощенно). Я могу зарегистрировать EventTransformer вручную как Transformer , и все работает отлично, но я не хочу регистрировать его вручную, я должен иметь возможность сделать это автоматически, чтобы я мог просто создать новый класс, и он сразу применение.

The requested service Transformer`1[[Event]]' has not been registered. To avoid this exception, either register a component to provide the service, check for service registration using IsRegistered(), or use the ResolveOptional() method to resolve an optional dependency.

Я пытался использовать метод .AsImplementedInterfaces () при регистрации классов, но, похоже, он не работал.

Так, что я должен сделать, чтобы достигнуть этого? Также, что касается бонусных баллов, у меня нет возможности узнать, что регистрирует Autofac и как он это регистрирует. Есть ли способ сделать это?

1 Ответ

4 голосов
/ 03 февраля 2012

Вам необходимо зарегистрировать открытых универсальных типов с помощью метода AsClosedTypesOf во время сканирования сборки :

builder.RegisterAssemblyTypes(typeof(MyAssemblyName).Assembly)
    .InstancePerLifetimeScope();
builder.RegisterAssemblyTypes(typeof(MyAssemblyName).Assembly)
    .AsClosedTypesOf(typeof(Transformer<>))
    .InstancePerLifetimeScope();

И вы можете получить зарегистрированные компоненты с:

IContainer container = builder.Build();
var registrations = container.ComponentRegistry.Registrations;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...