2014-06-30 35 views
0

我很欣賞問題標題可能有點模糊。我正在嘗試使用我自己的功能靈感類ResourceFactory<T>來抽象電子郵件提供商。所以ResourceFactory<T>的工作方式是它的構造函數需要一個Func<T>這是一個工廠來創建一個T的實例。 ResourceFactory<T>然後公開一個名爲Using<T>(Action<T>)的方法,該方法將採用Action<T>,通過在構造函數中調用傳遞給它的Func<T>來創建一個新的T對象,在預定義調度程序(例如線程池)上調用該操作,然後處理當功能完成時創建的T在StructureMap中選擇具有未配置參數的構造函數

因此,我的電子郵件提供商期望其構造函數中有一個ResourceFactory<SmtpClient>實例。它也可以被重載以接受名爲from的字符串,該字符串是電子郵件的發件人地址。代碼如下:

​​

ResourceFactory<T>基本上只是抽象了Observable.Using,像這樣:試圖設置此使用StructureMap時

public class ResourceFactory<T> 
    where T : IDisposable 
{ 
    private readonly Func<T> _factory; 
    private readonly IScheduler _scheduler; 

    /// <summary> 
    /// Create the given resource with a factory that will create instances of the resource. 
    /// </summary> 
    /// <param name="factory"></param> 
    public ResourceFactory(Func<T> factory, IScheduler scheduler) 
    { 
     _factory = factory; 
     _scheduler = scheduler; 
    } 

    /// <summary> 
    /// Invoke the given action by creating a new instance of the resource. 
    /// </summary> 
    /// <param name="invocation"></param> 
    public IObservable<Unit> Invoke(Action<T> invocation) 
    { 
     return Observable.Using(_factory, (t) => Observable.Start(() => invocation(t), _scheduler)); 
    } 
} 

我的問題來了。首先,StructureMap一直試圖使用重載的DotNetEmailProvider構造函數和from參數。在這一點上我不關心這一點,所以我調查一點點地瞭解如何「選擇」在StructureMap一個構造函數和結束了這段代碼:

x.SelectConstructor<DotNetEmailProvider>(() => new DotNetEmailProvider(null)); 
x.ForConcreteType<DotNetEmailProvider>() 
    .Configure 
     .Ctor<ResourceFactory<SmtpClient>>().Is(new ResourceFactory<SmtpClient>(() => new SmtpClient(), TaskPoolScheduler.Default)); 

x.For<IEmailProvider>() 
    .Use<DotNetEmailProvider>(); 

我現在的問題是,現在我「M收到此錯誤拋出:

{"StructureMap Exception Code: 202\nNo Default Instance defined for PluginFamily System.Reactive.Concurrency.IScheduler, System.Reactive.Interfaces, Version=2.2.4.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"} 

這對我來說沒有任何意義,因爲,是的,ResourceFactory<T>構造做,因爲它的第二個參數採取IScheduler實例,但我已經通過在中我的配置(TaskPoolScheduler.Default),我不一定要每一個IScheduler實例在整個應用程序中都是相同的(所以我不想'x.For<IScheduler>().Is(...)

什麼?

編輯:應當指出的據我所知,直至觀察到訂閱我的ResourceFactory<T>.Invoke方法不會「做」什麼,但我的問題仍然存在

回答

0

當我們問接口拋出異常IEmailProvider喜歡:

var provider = ObjectFactory.GetInstance<IEmailProvider>(); 

所以,我們應該配置IEmailProvider一點更精確的方式

x.For<IEmailProvider>() 
    .Use<DotNetEmailProvider>() 
    // plus this 
    .Ctor<ResourceFactory<SmtpClient>>().Is(new ResourceFactory<SmtpClient>(
     () => new SmtpClient(), TaskPoolScheduler.Default)); 

ñ流StructureMap知道的足夠多返回實例化IEmailProvider

+0

這正是我本來有,但StructureMap然後不停調用重載的構造函數,需要一個字符串,這不是我想要調用構造函數。 –

+0

我只是想說,這裏的配置應該屬於接口的'For' - 而不是實現。所以,不完全確定問題在哪裏......我們可以配置我們想要的任何構造函數...... –

+0

我可以理解,正如我所說的那樣,這是我原來的樣子,儘管我使用.SelectConstructor的例子都是使用.ForConcreteType和具體類型作爲插件類型。不過謝謝你的回答。 –

相關問題