2015-07-21 44 views
0

我在爲我的類編寫有效配置時遇到了問題。 假設我有:如何使用直接類結構映射強制

interface IA{} 

class abstract A : IA {} 

class A1 : A, IA 
{ 
    private readonly IB _ib; 

    public A1(IB ib) 
    { 
     _ib = ib; 
    } 
} 

class A2 : A, IA 
{ 
    private readonly IB _ib; 

    public A1(IB ib) 
    { 
     _ib = ib; 
    } 
} 

我要注入這個班給他人的構造函數,我認爲我有沒有問題,通過這樣的事情這樣做:

For<IEnumerable<IA>>.Use(x => x.AllInstances<A>()); 

但我不知道要解決財產ib的問題,如果我想爲類A1和類A2使用不同的_ib。

interface B{} 

class B1 : B {} 

class B2 : B {} 

我知道,如果我只有一類像B和類像AI可以簡單地做這樣的事情:

For<IA>().Use<ASample>().CTor<IB>().Is<BSample>(); 

但與我的問題我嘗試使用這樣的:

For<IA>().ConditionallyUse(c => { c.If(t => t.ConcreteType == typeof(A1)) 
.ThenIt 
.Is.ConstructedBy(by => new A1(by.InstanceOf<B1>()));  
c.If(t => t.ConcreteType == typeof(A1)) 
.ThenIt 
.Is.ConstructedBy(by => new A2(by.InstanceOf<B2>())); 
}); 

但它給我的雙向註冊的錯誤..

或者,也許我應該考慮大約是這樣的:

For<IEnumerable<IA>>.Use(x => x.AllInstances<A>()); 
For<IEnumerable<IB>>.Use(x => x.AllInstances<B>()); 

但這種變異我應該創建一個抽象類,並使用從列表中只有一個注入屬性附加的方法(這與接口B繼承的類)。

如果有人可以幫助我,我將非常感激!

回答

0

解決我的問題是寫類似的東西:

For<IA>().Add<A1>().CTor<IB>().Is<B1>(); 
For<IA>().Add<A2>().CTor<IB>().Is<B2>(); 

//and then 
For<IEnumerable<IA>>.Use(x => x.GetAllInstances<IA>());