2010-09-02 9 views
1

我有一個構造函數,需要兩個接口,它們是相同的接口,但需要不同的實現:如何使用sturcturemap將單個接口的兩個不同實現傳遞給構造函數?

public class Foo 
{ 
    public Foo(IBar publicData, IBar privateData) 
    { 
    } 
} 

我想發生的是,structuremap將通過在具體實施IBar作爲class PublicDataclass PrivateData爲不同的參數。這可能嗎?

UPDATE

事實上,以確保有足夠的信息:

說我有看這樣工作的真正的類:

public abstract class EFRepository<T> : IRepository<T> 
{ 
    protected EFRepository(IUnitOfWork publicUnitOfWork, 
          IUnitOfWork privateUnitOfWork) 
    { 

    } 
} 

和實施的EFRepository可能看起來像這樣:

public partial class ClaimRepository: EFRepository<Claim>, IClaimRepository 
{ 
    public ClaimRepository(IUnitOfWork publishedUnitOfWork, 
          IUnitOfWork unpublisedUnitOfWork) 
      : base(publishedUnitOfWork, unpublisedUnitOfWork) 
    { 
    } 
} 

所以當我從結構映射請求IClaimRepository的實例時,我希望爲實現提供正確的工作對象單元,在我的實例中基本上是兩個不同的數據庫,所以它是具有不同連接字符串的相同代碼。

回答

1

還沒有編譯和測試,但它應該在工作原理:

For<IBar>.Add<PublicData>.Named("public"); 
For<IBar>.Add<PrivateData>.Named("private"); 

For<IFoo>.Use<Foo>() 
    .Ctor<IBar>("publicData").Is(d => d.TheInstanceNamed("public")) 
    .Ctor<IBar>("privateData").Is(d => d.TheInstanceNamed("private")); 

編輯: 爲了使這種按約定的IRegistrationConvention可以用來

public class FooConvention : IRegistrationConvention 
{ 
    static readonly Type PluginType = typeof(IFoo); 

    public void Process(Type type, Registry registry) 
    { 
    if (type.IsAbstract || !type.IsClass || !PluginType.IsAssignableFrom(type)) 
     return; 

     registry.For(PluginType).Add(type) 
     .CtorDependency<IBar>("publicData") 
     .IsNamedInstance("public") 
     .CtorDependency<IBar>("privateData") 
     .IsNamedInstance("private"); 
    } 
} 

公約將在掃描中應用

Scan(scan => 
{ 
    scan.AssemblyContainingType<IFoo>(); 
    scan.Convention<FooConvention>(); 
} 

請參閱SM文檔中的Scanning Assemblies section瞭解更多信息。

+0

有沒有一種方法,這可以適用於基於約定的系統?我寧願不必手動連接所有的存儲庫。 – ilivewithian 2010-09-06 08:58:24

+0

請參閱我的編輯,瞭解我使用過的可能方法。 – PHeiberg 2010-09-06 09:28:21

0

設置的配置如下:

For<IFoo>.Use<Foo>(); 
For<IBar>.Use<IBar>(); 

然後拿到情況如下:

IBar privateData = ObjectFactory.GetInstance<IBar>(); 
IBar publicData = ObjectFactory.GetInstance<IBar>(); 

IFoo foo = ObjectFactory 
    .With<IBar>(publicData) 
    .With<IBar>(privateBar) 
    .GetInstance<IFoo>(); 

這僅僅是一個建議。我站在更正:-)

相關問題