2016-09-28 4 views
0

Итак, у меня установлен виндзор и все мои услуги зарегистрированы. У меня есть класс, который требует этих сервисов в ctor, но этот класс не зарегистрирован в Windsor, так как у него нет интерфейса, и я не хочу его использовать ради разрешения зависимостей. Я действительно заинтересован в том, что решение Windsor разрешено и внедряет мои зарегистрированные зависимости и отсылает обратно инициализированный класс - в основном завод.Как я могу использовать windsor, чтобы дать мне экземпляр объекта, который не зарегистрирован?

Проблема, что я бегу в том, что Виндзорский бросает, потому что зависимый класс не был зарегистрирован:

void Main() 
{ 
    var container = new WindsorContainer(); 
    container.Register(Component 
     .For<ITestInterface>() 
     .ImplementedBy<TestImpl>() 
     .LifestyleTransient()); 

    var c = container.Resolve<TestClass>(); // throws because TestClass isn't registered 
    c.Run(); 
} 

public class TestClass 
{ 
    private ITestInterface _d; 

    public TestClass(ITestInterface d) 
    { 
     _d = d; 
    } 

    public void Run() 
    { 
     _d.Do(); 
    } 
} 

public interface ITestInterface 
{ 
    void Do(); 
} 

public class TestImpl : ITestInterface 
{ 
    public void Do() 
    { 
     Console.WriteLine("done");  
    } 
} 

То, что я не хочу, чтобы в конечном итоге делает, что-то вроде этого:

var dependency1 = container.Resolve<ITestInterface>(); 
var c = new TestClass(dependency1); 
c.Run(); 

Потому что теперь мы находимся на территории локатора обслуживания. Но что более важно, классы, которые имеют несколько зависимостей ... ну, что может стать утомительным.

Как я могу заставить Windsor получить желаемый заводской эффект? Или это возможно даже с Виндзором? Я помню, что это было связано с Ниндектом.

+1

Вы не можете получить контейнер IoC, чтобы построить что-то он не знает. Он должен быть зарегистрирован. Почему бы вам не зарегистрировать его? Компонентам не требуется отдельный интерфейс для регистрации. – Amy

+0

Поймите, что это не относится к вопросу, но из любопытства, почему вы выбрали это по Ninject? –

+0

@ Dan-Cook это было некоторое время с тех пор, как я использовал ninject, но Windsor просто чувствовал себя более естественным, и настроение вообще не приносило никаких усилий. – Sinaesthetic

ответ

0

Таким образом, популярный ответ, похоже, «Просто зарегистрируйте компонент», который мне действительно не нравится вообще, потому что для такого простого варианта использования я мог бы получить класс конфигурации с сотнями ненужных регистраций. Это глупо. Так что пока я покажу некоторые встроенные функции для этого, я создаю дрянное расширение, которое должно приземлиться где-нибудь посередине. Это расширение просто берет тип, регистрирует его для вас, а затем пытается его разрешить. Таким образом, это используя собственные разрешения т е р логики Виндзор:

public static class WindsorExtentions 
{ 
    public static T Construct<T>(this IWindsorContainer container) 
     where T : class 
    { 
     if (!container.Kernel.HasComponent(typeof(T))) 
      container.Register(Component.For<T>()); 

     var instance = container.Resolve<T>(); 
     return instance; 
    } 
} 

То, что я действительно хотел бы сделать, это зарегистрировать его, решить ее, а затем отменить его, но это, кажется, что метод RemoveComponent был удален в 3.0. Между тем это должно быть хорошо. Очевидно, что это не всеохватываемое с использованием случаев, но когда у вас есть множество прокси-классов, у которых есть несколько требуемых зависимостей для инъекций, я думаю, что это помогает.

Использование:

var myClassWithDependencies = myContainer.Construct<MyClassWithDependencies>(); 

public class MyClassWithDependencies 
{ 
    public MyClassWithDependencies(
     IFacebookClient facebookClient, 
     IGooglePlusClient googlePlusClient, 
     ITwitterClient twitterClient, 
     ISalesforceClient salesforceClient, 
     IReportRepository reportRepo, 
     IUserRepository userRepo) 
    { 

    } 

}

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

  • Нет связанных вопросов^_^