我很欣賞問題標題可能有點模糊。我正在嘗試使用我自己的功能靈感類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
方法不會「做」什麼,但我的問題仍然存在
這正是我本來有,但StructureMap然後不停調用重載的構造函數,需要一個字符串,這不是我想要調用構造函數。 –
我只是想說,這裏的配置應該屬於接口的'For' - 而不是實現。所以,不完全確定問題在哪裏......我們可以配置我們想要的任何構造函數...... –
我可以理解,正如我所說的那樣,這是我原來的樣子,儘管我使用.SelectConstructor的例子都是使用.ForConcreteType和具體類型作爲插件類型。不過謝謝你的回答。 –