0

嗨,我正在使用 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>();

但似乎没有达到代码。我该如何解决这个问题?

4

1 回答 1

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>.

于 2013-06-27T15:35:41.480 回答