具有泛型类型的StructureMap OnCreation

时间:2011-10-26 12:36:34

标签: c# generics structuremap

您好我想在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映射中做到这一点。

请帮助:)

1 个答案:

答案 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;
    }
}