Unity为一个接口配置2实现

时间:2013-06-27 13:29:36

标签: c# unity-container

您好我使用unity作为我的ioc容器,我有一个案例,我需要使用特定案例的实现,以及其他情况下的另一个实现。

这是我的界面:

public interface IMappingService<TFrom , TTo>
{
    TTo Map(TFrom source);
}

这是我的两个实现:

 public class AutoMapperService<TFrom, TTo> : IMappingService<TFrom, TTo>
{
    public TTo Map(TFrom source)
    {
        TTo target = Mapper.Map<TTo>(source);
        this.AfterMap(source, target);
        return target;
    }

    protected virtual void AfterMap(TFrom source, TTo target)
    {

    }
}

public class AutoMapperGetUpcomingLessonsService : AutoMapperService<GetUpcomingLessons_Result, UpcomingLessonDTO>
    {
        private readonly IOfficialNamesFormatter m_OfficialNamesFormatter;

        public AutoMapperGetUpcomingLessonsService(IOfficialNamesFormatter officialNamesFormatter)
        {
            m_OfficialNamesFormatter = officialNamesFormatter;
        }

        protected override void AfterMap(GetUpcomingLessons_Result source, UpcomingLessonDTO target)
        {
            target.TeacherOfficialName = m_OfficialNamesFormatter.GetOfficialName(target.TeacherGender,
                                                                                  target.TeacherMiddleName,
                                                                                  target.TeacherLastName);
        }
    }

我使用IServiceLocator访问代码中的实现:

ServiceLocator.GetInstance<IMappingService<IEnumerable<GetUpcomingLessons_Result>, IEnumerable<UpcomingLessonDTO>>>();

在大多数情况下,我想使用AutoMapperService实现,为此我在dependencyConfig文件中指定了这个:

  container.RegisterType(typeof(IMappingService<,>), typeof(AutoMapperService<,>));

当我想使用AutoMapperGetUpcomingLessonsService作为我的实现时出现问题。我尝试添加这个:

container.RegisterType<IMappingService<GetUpcomingLessons_Result, UpcomingLessonDTO>, AutoMapperGetUpcomingLessonsService>();

但似乎没有达到代码。我怎么能解决这个问题?

1 个答案:

答案 0 :(得分:1)

您的课程定义为:

AutoMapperGetUpcomingLessonsService 
    : AutoMapperService<GetUpcomingLessons_Result, UpcomingLessonDTO>

并注册如下:

container.RegisterType<IMappingService<GetUpcomingLessons_Result, 
    UpcomingLessonDTO>, AutoMapperGetUpcomingLessonsService>();

但是这样解决了:

ServiceLocator.GetInstance<IMappingService<
    IEnumerable<GetUpcomingLessons_Result>, IEnumerable<UpcomingLessonDTO>>>();

由于您注册了封闭式泛型,因此需要完全匹配类型。 IEnumerable<GetUpcomingLessons_Result>GetUpcomingLessons_Result的类型不同。因此,您应该在没有IEnumerable的情况下解决,或者将类定义和注册更改为IEnumerable<T>