0

Интерфейс зависит от того же типа интерфейса для выполнения некоторых определенных действий. Но когда я пытаюсь зарегистрировать его с единицей Я получаюUnity Self Dependent Interface Регистрация

необработанное исключение типа «System.StackOverflowException» произошло в Microsoft.Practices.Unity.DLL

Я думаю, что он падает в вид собственной референтной петли и заполняет память.

Есть ли что-то не так для моего подхода. Как это можно решить?

У меня такой интерфейс;

public interface IEnvironment 
{ 
    string RootUrl { get; set; } 
    string ImagesPath { get; set; } 
    IEnvironment DependentEnvironment { get; set; } 
} 

Это представление моей работающего кода среды, такие как Localhost, производство, Windows Phone Simulator и т.д ..

У меня есть два класса, реализующего это прямо сейчас;

class Localhost : IEnvironment 
{ 
    public string RootUrl { get; set; } 
    public string ImagesPath { get; set; } 
    public IEnvironment DependentEnvironment { get; set; } 

    public Localhost(IEnvironment dependentEnvironment) 
    { 
     ImagesPath = "images"; 
     DependentEnvironment = dependentEnvironment; 
    } 
} 

и

public class WindowsPhoneSimulator : IEnvironment 
    { 
     public string RootUrl { get; set; } 
     public string ImagesPath { get; set; } 
     public IEnvironment DependentEnvironment { get; set; } 
     public WindowsPhoneSimulator(IEnvironment dependentEnvironment) 
     { 
      ImagesPath = "/Assets/images"; 
      DependentEnvironment = dependentEnvironment; 
     } 
    } 

так что среда может зависеть еще один? Зачем? Поскольку, например, WindowsPhoneSimulator может совершать вызовы api на localhost, и когда я развертываю приложение, я буду менять инъекцию как ProductionEnvironment. Поэтому он должен знать, какую среду вызывать.

Проблема начинается, когда я начинаю разрешать свои объекты:

IocContainer.RegisterType<IEnvironment, WindowsPhoneSimulator>(); 

любые предложения?

+1

Возможно, вы захотите зарегистрировать всю среду как именованные экземпляры с зависимыми средами 'RegisterInstance' и вручную' Resolve'' ... возможно, вам понадобится использовать дочерние контейнеры.Вы должны подумать о том, что должно произойти, когда вы решите () '- Unity не может волшебным образом определить, что именно вы хотите в результате (я не уверен ни на одном из ваших вопросов), поэтому для этого потребуется некоторый уточнение (возможно, имя 'Resolve (« Телефон »)'). –

ответ

2

Вы не указали, как вы регистрируете свои типы, но, предположительно, вы просто регистрируете их стандартным методом RegisterType. Когда вы регистрируете второй тип, он будет перезаписывать первый, поэтому Unity знает только об одном из ваших классов (тот, который зарегистрирован второй). Тогда имеет смысл, почему вы получаете исключение переполнения стека, потому что он пытается создать экземпляр, скажем, класс WindowsPhoneSimulator для перехода в класс WindowsPhoneSimulator ... который, очевидно, он не может сделать.

Вместо этого вам нужно будет зарегистрировать типы в единстве как «именованные типы», а затем, когда вы хотите использовать один из них, вы создаете переопределение зависимостей при разрешении класса, чтобы сообщить Unity, какой из них вы хотите использовать.

Таким образом, зарегистрировать типы именованных типов:

container.RegisterType<IEnvironment, Localhost>("Localhost") 
container.RegisterType<IEnvironment, WindowsPhoneSimulator>("WindowsPhoneSimulator") 

Затем, когда вы хотите создать тип, что-то вроде этого:

DependencyOverride dep = new DependencyOverride(typeof(IEnvironment) 
         , container.Resolve<IEnvironment>("Localhost")); 

IEnvironment obj2 = container.Resolve<IEnvironment>("WindowsPhoneSimulator", dep); 

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

+0

named instance и DependencyOverride, что я ищу. Я еще не тестировал, но логика, которую я вижу из вашего примера, имеет смысл. –

Смежные вопросы