2014-06-30 40 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和具体类型作为插件类型。不过谢谢你的回答。 –

相关问题