我很欣赏问题标题可能有点模糊。我正在尝试使用我自己的功能灵感类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和具体类型作为插件类型。不过谢谢你的回答。 –