您好我想在StructureMap创建存储库实例之后调用方法Foo,因此有一个方法,称为OnCreation。
x.For(typeof(IRepository<>))
.Use(typeof(Repository<>))
.OnCreation((ctx, instance) => { instance.Foo() });
但是编译器当然不能推断出类型,所以我试着提供这样的通用类型:
x.For(typeof(IRepository<>))
.Use(typeof(Repository<>))
.OnCreation<Repository<>>((ctx, instance) => { instance.Foo() });
这不会编译,甚至不会解析(无效的表达式术语'&gt;)。我试图自己构建Action对象,但没有运气。然后我发现了InstanceInterceptor,所以我写了一个类,但是我无法想出如何插入它。应该有InterceptWith方法,但它不适用于ConfiguredInstance,它是非泛型Use方法的结果类型。 / p>
我知道我可以通过许多其他方式解决这个问题,但我想在StructureMap映射中做到这一点。
请帮助:)
答案 0 :(得分:2)
如果您的Foo()
方法不需要访问泛型类型,那么您可以将其抽象为不同的接口:
public interface IRepository
{
void Foo();
}
public interface IRepository<T> : IRepository
{
}
public class Repository<T> : IRepository<T>
{
public void Foo()
{
}
}
然后配置StructureMap:
cfg.For(typeof(IRepository<>)).Use(typeof(Repository<>))
.OnCreation<IRepository>((ctx, handler) =>
{
handler.Foo();
});
使用开放式通用类型,事情变得非常棘手,而且我经常发现将更多初始化逻辑交给工厂更容易。注入IRepository<T>
而不是注入IRepositoryFactory<T>
,可以执行所需的任何其他初始化(如果您不喜欢静态StructureMap引用,仍可以将IRepository<T>
注入工厂中:
public interface IRepositoryFactory<T>
{
IRepository<T> Create();
}
public class RepositoryFactory<T> : IRepositoryFactory<T>
{
public IRepository<T> Create()
{
var repo = ObjectFactory.GetInstance<IRepository<T>>();
repo.Foo();
return repo;
}
}