1

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

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

我希望InitializeMappings每当 Unity 容器实例化一个新的 IMapper 实例时调用该函数。

我需要帮助:

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

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

4

2 回答 2

5

这是糟糕的设计;为什么不让映射器实现直接在其构造函数中调用 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,而不适用于配置文件。

于 2013-04-17T19:55:51.947 回答
2

在 WPF 中,我相信您可以执行以下操作

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

至于“将调用连接到 IMapper 的生命周期”,我不明白你的意思。当映射器对象存在时,任何创建并仅由映射器对象引用的对象都将被垃圾收集。

于 2013-04-16T06:08:42.103 回答