2008-12-16 28 views
1

我有一個接口,我已經使用了StructureMap依賴項注入結構圖和公共屬性的問題我需要設置

public interface IFileStorageService 
{ 
    void SaveFile(string fileName, byte[] data); 
} 

接口不關心在哪裏保存數據。無論是內存,文件,網絡資源,太空中的衛星......

所以,我有兩個類來實現這個接口;一個test classnetwork file storage class: -

public class TestFileStorageService : IFileStorageService 
{ ... etc ...} 

public class NetworkFileStorageService : IFileStorageService 
{ 
    public string NetworkUnc { get; set; } 
    public void SaveFile(...); 
} 

通知我NetworkFileStorageService如何有一個屬性?該類需要這個值來實現SaveFile方法。

嗯,我不知道如何定義該屬性。

我以爲我可以硬編碼在這裏我定義我的依賴關係(例如,在我的引導程序法 - >ForRequestedType<IFileStorageService> ...等),但起腳..業務邏輯DEFINES位置。這不是靜態的。

最後,因爲我在我的邏輯中使用接口,此屬性不可用。

任何人都可以幫忙嗎?

如果可以的話,圖像要保存兩個文件

  • 名稱:Test1.bin;位置:\ server1 \ folder1
  • 名稱:Test2.bin;位置:\ server1 \ folder2

乾杯!

回答

0

結構圖假定所有構造函數參數都是必需的,屬性是可選的。

有幾種方法可以用結構圖來解決這個問題。 您可以創建一個工廠方法這樣

x.ForRequestedType<Func<string, IFileStorageService>>() 
    .TheDefault.Is.ConstructedBy(
    () => 
    NetworkUnc => 
    { 
     var args = new StructureMap.Pipeline.ExplicitArguments(); 
     args.SetArg("NetworkUnc", NetworkUnc); 
     return StructureMap.ObjectFactory.GetInstance<IFileStorageService>(args); 
    }); 

現在你可以用

StructureMap.ObjectFactory 
    .GetInstance<Func<string, IFileStorageService>>()("something"); 

創建對象,但是那不是那個漂亮。 或者爲這個類創建一個配置類。

public class NetworkFileStorageServiceConfig 
{ 
    public string NetworkUnc { get; set; } 
} 

,並配置它

x.ForRequestedType<NetworkFileStorageServiceConfig>().TheDefault.Is.IsThis(
    new NetworkFileStorageServiceConfig { NetworkUnc = "something" }); 

我敢肯定有很多其他的方式來做到這一點。

+0

我喜歡 - 你可能也會獲得necro獎勵:) – 2009-11-09 14:16:20

0

如果只有這個實現需要這個,那麼把這個放在你的構造函數中呢?

+0

因爲我不確定如何定義構造函數參數_at業務邏輯time_。請記住,這不是一個靜態值..那麼我如何在代碼中設置'?我知道如何定義構造函數參數,如果我使用ForRequestedType <..>來連接DI,但這不會有幫助。 – 2008-12-16 05:38:05

相關問題