4

我们在 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 添加到他们正在使用的类的构造函数中,而不是在我们的统一配置中添加另一行来注册他们正在使用的每个类.

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

4

2 回答 2

12

是的,您可以使用:

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

于 2013-04-04T15:07:29.513 回答
0

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

如果 Dave 的回答还不够,我很确定您可以向 Unity/ObjectBuilder 编写一个插件,该插件将注册一个新策略或一组策略,涵盖您想要的任何类型映射,包括自动装配扫描或物化仿制药。

请参阅http://www.orbifold.net/default/unity-objectbuilder-part-ii/上的系列文章和附近的部分

Context.Strategies.AddNew< buildkeymappingstrategy >(UnityBuildStage.TypeMapping);
于 2013-04-04T15:11:24.217 回答