2014-01-08 86 views
0

我想要一個組件在註冊表中創建/註冊後註冊其他組件。比方說,我有以下組成部分:組件如何提供其他組件?

interface IConfiguration 
{ 
    string SourceDirectory { get; } 
    string TargetDirectory { get; } 

    // other primitive-typed configuration parameters 
} 

class FileConfiguration : IConfiguration 
{ 
    // read parameters from some config file 
} 

class SourceDirectoryWrapper 
{ 
    public byte[] ReadFile(string filename) 
    { 
     // read a file from the source directory 
    } 

    public string Directory { get; set; } 
} 

class TargetDirectoryWrapper 
{ 
    public byte[] WriteFile(string filename) 
    { 
     // write a file into the source directory 
    } 

    public string Directory { get; set; } 
} 

class DirectoryWrapperFactory 
{ 
    public DirectoryWrapperFactory(IConfiguration config) 
    { 
     var source = new SourceDirectoryWrapper { 
      Directory = config.SourceDirectory 
     }; 
     var target = new TargetDirectoryWrapper { 
      Directory = config.SourceDirectory 
     }; 
    } 
} 

組件FileConfigurationDirectoryWrapperFactory可以註冊爲是平常。

但是,我想完成的是以某種方式「取消」在DirectoryWrapperFactory中創建的sourcetarget對象。基本思想是不同的環境可能需要不同的配置提供者。 (即使沒有,我認爲將讀取配置參數放入單獨的組件也是個好主意。)

我還想在IoC容器中管理SourceDirectoryWrapperTargetDirectoryWrapper。在我的情況下,主要是爲了方便 - 我有一個我需要的EventSource實現,所以我使用屬性autowiring注入它。不在IoC容器中的每個對象都需要明確傳遞,這是我的錯誤。

所以:這可能與AutoFac?如果是這樣,怎麼樣?我對生命週期事件進行了抨擊,但大多數人不允許在構建對象後訪問註冊表。

回答

1

我不太明白爲什麼DirectoryWrapperFactory需要存在。你可以只註冊SourceDirectoryWrapper和TargetDirectoryWrapper直接作爲正常wireup的一部分:

builder.Register(c => new SourceDirectoryWrapper { 
     Directory = c.Resolve<IConfiguration>().SourceDirectory 
    }); 

builder.Register(c => new TargetDirectoryWrapper { 
     Directory = c.Resolve<IConfiguration>().SourceDirectory 
    }); 
+0

我用匯編掃描,除了一個EventSourceProxy實現一切..這是完全有可能的,它只是讓我不知道我可以註冊一些事情手動。 – millimoose