StructureMap Registry DSL用于静态工厂类

时间:2011-02-25 22:22:51

标签: .net structuremap

我正在试图弄清楚是否可以使用StructureMap注册表DSL代表以下内容......

我想让StructureMap注入一个ILog< T>为我上课。我已经看到了执行以下操作的示例:

For(typeof(ILog<>)).Use(typeof(Log<>));

但是,我有一个静态工厂类,可以创建我的ILog&lt; T&gt;实例,像这样:

LogFactory.CreateLog<T>();

有没有办法在StructureMap的Registry DSL中连接它?

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

我找到了让它发挥作用的方法,但它绝对不是直截了当的:

[Test]
public void create_open_generic_using_static_factory()
{
    var container = new Container(x => x.For(typeof (ILog<>))
        .EnrichWith(createWithFactory)
        .Use(typeof (DummyLog<>)));

    var instance = container.GetInstance<ILog<int>>();
    instance.ShouldBeOfType<Log<int>>();

    var instance2 = container.GetInstance<ILog<string>>();
    instance2.ShouldBeOfType<Log<string>>();
}

private static object createWithFactory(object dummyInstance)
{
    var closingType = dummyInstance.GetType().GetGenericArguments()[0];
    var openCreateLog = typeof(LogFactory).GetMethod("CreateLog");
    var closedCreateLog = openCreateLog.MakeGenericMethod(closingType);
    return closedCreateLog.Invoke(null, null);
}

public static class LogFactory
{
    public static ILog<T> CreateLog<T>()
    {
        return new Log<T>();
    }
}

public interface ILog<T> { }
public class Log<T> : ILog<T> { }
public class DummyLog<T> : ILog<T>{}

请注意DummyLog<>的使用。这只是为了让StructureMap认为有一个默认实例 - 它实际上永远不会从容器返回,因为它被createWithFactory方法的结果所取代。

如果您可以摆脱工厂方法并将逻辑放入StructureMap注册中的richment / interceptor / OnCreation子句,那么事情肯定会更简单。

答案 1 :(得分:0)

AFAIK你不能这样做。 IOC容器都是关于提供实例的,静态类不是实例。

我建议在实现ILog的类中包装静态调用。