Automapper自定义解析器 - 将仓库注入构造函数

5

我正在尝试为automapper创建自定义解析器,该解析器需要访问我的数据存储库以检索已登录用户的帐户。

以下是我的代码...

public class FollowingResolver : ValueResolver<Audio, bool>
    {
        readonly IIdentityTasks identityTasks;

        public FollowingResolver(IIdentityTasks identitTasks)
        {
            this.identityTasks = identitTasks;
        }

        protected override bool ResolveCore(Audio source)
        {
            var user = identityTasks.GetCurrentIdentity();
            if (user != null)
                return user.IsFollowingUser(source.DJAccount);

            return false;
        }
    }

然而,我遇到了这个错误:
FollowingResolver' does not have a default constructor

我尝试添加了一个默认构造函数,但我的仓库从未初始化。

这是我的autoampper初始化代码:

public static void Configure(IWindsorContainer container)
        {
            Mapper.Reset();
            Mapper.Initialize(x =>
            {
                x.AddProfile<AccountProfile>();
                x.AddProfile<AudioProfile>();
                x.ConstructServicesUsing(container.Resolve);
            });

            Mapper.AssertConfigurationIsValid();
        }

我是否遗漏了什么?像这样做是否可能,还是我在这里错过了什么重要的细节?

2个回答

3

我在使用Castle Windsor注入服务时遇到了相同的错误。

我需要添加以下内容:

Mapper.Initialize(map =>
{
    map.ConstructServicesUsing(_container.Resolve);
});

Mapper.CreateMap调用之前。

创建了一个像这样的ValueResolverInstaller:

public class ValueResolverInstaller : IWindsorInstaller
{
    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        container.Register(Classes.FromThisAssembly()
                                .BasedOn<IValueResolver>()
                                .LifestyleTransient());
    }
}

还有ValueResolver本身:

public class DivergencesResolver : ValueResolver<MyClass, int>
{
    private AssessmentService assessmentService;

    public DivergencesResolver(AssessmentService assessmentService)
    {
        this.assessmentService = assessmentService;
    }

    protected override int ResolveCore(MyClass c)
    {
        return assessmentService.GetAssessmentDivergences(c.AssessmentId).Count();
    }
}

3

很快就找到了解决方案......我忘记将我的解析器添加为IoC容器。

现在运行得很好!


1
你可以在应用程序的任何地方使用IoC.Resolve<ISomething>()。 - Omu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接