2016-09-28 38 views
0

所以我有windsor設置和我的所有服務註冊。我有一個需要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獲得理想的工廠效果?或者這對溫莎來說甚至是可能的?我記得這與Ninject有關。

+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) 
    { 

    } 

}

相關問題