Замок Виндзор: Как зарегистрировать внутренние реализации - PullRequest
3 голосов
/ 03 декабря 2009

Эта регистрация работает, когда все реализации IService являются публичными:

AllTypes
    .Of<IService>()
    .FromAssembly(GetType().Assembly)
    .WithService.FirstInterface()

Например:

public interface IService {}
public interface ISomeService : IService {}
public class SomeService : ISomeService {}

Решение ISomeService возвращает экземпляр SomeService.

Но если класс SomeService является внутренним, контейнер создает исключение, в котором говорится, что ISomeService не зарегистрирован.

Так есть ли способ зарегистрировать внутренние реализации для открытых интерфейсов?

1 Ответ

7 голосов
/ 03 декабря 2009

UPDATE2: Хотя я считаю, что это не очень хорошая идея, вы можете достичь этого с помощью следующего кода.

AllTypes.FromAssembly(GetType().Assembly)
    .IncludeNonPublicTypes()
    .BasedOn<IService>()
    .WithService.FirstInterface();

UPDATE: Это очень логичное поведение, и я бы посчитал это ошибкой, если бы было иначе. AllTypes предоставляет только открытый тип, потому что он предполагает, что если вы сделали свой тип внутренним, вы сделали это по какой-то причине, и если он выявил это, это может быть проблемой безопасности.

Когда вы регистрируете тип явно с другой стороны, это работает, потому что Виндзор предполагает, что, поскольку вы явно просите его использовать внутренний тип, вы знаете это лучше.


...