使用Unity调用静态注入方法

时间:2013-04-15 02:22:36

标签: c# dependency-injection unity-container

我们有一个类(实际上很多)有一个静态初始化函数,它需要在依赖注入容器中的对象上执行(使用Unity)。

public class MyClass
{
    public static void InitializeMappings(IMapper mapper)
    {
        // Do stuff to mapper
    }
}

我想在Unity容器实例化新的IMapper实例时调用InitializeMappings函数。

我需要帮助:

  • 从容器中调用InitializeMappings函数
  • 解析函数调用的mapper参数
  • 将对InitializeMappings的呼叫连接到IMapper实施的生命周期

我将如何实施/定义这个?

2 个答案:

答案 0 :(得分:5)

这是糟糕的设计;为什么不让mapper实现直接在它们的构造函数中调用setup函数?

您可以通过扩展程序或使用注射工厂来获取容器。像这样:

container.RegisterType<IMapper>(
    new WhateverLifetimeYouWant(),
    new InjectionFactory(
        c => {
            var mapper = c.Resolve<IMapper>("RealMapper");
            MyClass.InitializeMappings(mapper);
            return mapper;
        }
)
.RegisterType<IMapper, ActualMapper>("RealMapper");

然后,只要你container.Resolve<IMapper>(),它就会运行那么一小块代码。

这仅适用于API,而不是通过配置文件。

答案 1 :(得分:2)

在WPF中,我相信你可以做到以下

container.RegisterType<Mapper, Mapper>();
container.Register<IMapper>(
    new InjectionFactory(c => {
        var mapper = c.Resolve<Mapper>(); 
        MyClass.InitializeMappings(mapper);
        return mapper;
    })
);

就“将通话连接到IMapper的生命周期”而言,我不明白你的意思。创建并仅由映射器对象引用的任何对象将在映射器对象时进行垃圾收集。