您好我使用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>();
但似乎没有达到代码。我怎么能解决这个问题?
答案 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>
。