Unity的通用依赖注入

时间:2013-04-04 15:03:35

标签: c# dependency-injection unity-container

我们在C#应用程序中将现有的日志记录库包装在我们自己的日志记录服务中,并使用预定义的方法将其包围在某些日志记录情况中。

public class LoggingBlockLoggingService : ILoggingService
{
    private LogWriter writer;

    public LoggingBlockLoggingService(LogWriter writer)
    {
        this.writer = writer;
    }
    ....//logging convenience methods, LogWarning(), etc...
}

我想修改这个实现,以便它接受实例化它的类的类型(底层记录器,在这种情况下是LogWriter,将是一个单例)。因此要么使这个实现(和接口ILoggingService)通用:

public class LoggingBlockLoggingService<T> : ILoggingService<T>
{
    ...
    private string typeName = typeof(T).FulName;
    ...

或添加其他构造函数参数:

public class LoggingBlockLoggingService : ILoggingService
{
    private LogWriter writer;
    private string typeName;

    public LoggingBlockLoggingService(LogWriter writer, Type type)
    {
        this.writer = writer;
        this.typeName = type.FullName;
    }
    ....//Include the typeName in the logs so we know the class that is logging.
}

在注册我们的类型时,有没有办法在Unity中配置一次?我想避免为每个想要记录的类添加一个条目。理想情况下,如果有人想在我们的项目中向类中添加日志记录,他们只需将ILoggingService添加到他们正在使用的类的构造函数中,而不是在我们的unity配置中添加另一行来注册他们正在处理的每个类。

我们正在使用运行时/代码配置,而不是XML

2 个答案:

答案 0 :(得分:11)

是的,您可以使用:

container.RegisterType(typeof(IMyGenericInterface<>), typeof(MyConcreteGenericClass<>));

答案 1 :(得分:0)

在你的情况下,当有简单的直接泛型 - param - to - generic-param映射时,Unity可能实际上处理了这个问题,但是我怀疑是否有任何更高级的情况都没有处理,因为某些时候某些东西必须处理提供类型之间的泛型参数的映射(谎言重新排序键值与值键等)。

如果Dave的回答还不够,我相当肯定你可以为Unity / ObjectBuilder写一个插件,它会注册一个新策略或一套策略,它们可以覆盖你想要的任何类型映射,包括自动装配扫描或仿制药的具体化。

请参阅http://www.orbifold.net/default/unity-objectbuilder-part-ii/处的文章系列和

附近的部分
Context.Strategies.AddNew< buildkeymappingstrategy >(UnityBuildStage.TypeMapping);