我正在试图弄清楚是否可以使用StructureMap注册表DSL代表以下内容......
我想让StructureMap注入一个ILog< T>为我上课。我已经看到了执行以下操作的示例:
For(typeof(ILog<>)).Use(typeof(Log<>));
但是,我有一个静态工厂类,可以创建我的ILog&lt; T&gt;实例,像这样:
LogFactory.CreateLog<T>();
有没有办法在StructureMap的Registry DSL中连接它?
非常感谢任何帮助!
答案 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的类中包装静态调用。