1

NuGetでCastleWinsorとAutoMapperの参照を最新バージョンに更新するまで、すべてが正常に機能していましCastle.Windsor.3.0.0.4001AutoMapper.2.0.0

と同じアセンブリにAutoMapperプロファイルのリストがありますAutoMapperInstaller : IWindsorInstaller。それらは異なる名前空間にありますが、これは問題ではありませんよね?

プロファイルの例を次に示します。

namespace FieldService.Web.Mappings
{
 public class RoleMappings : Profile
 {
    protected override void Configure()
    {
        AutoMapper.Mapper.CreateMap<RoleModel, Role>()
            .ConstructUsing((role) => new Role() { Permissions = new List<Permission>() })
            .ForMember(m => m.Permissions, o => o.MapFrom(src => src.Permissions.Where(p => p.Selected == true)));
    }
 }
}

これがAutoMapperInstaller

namespace FieldService.Web.Infrastructure.IOC
{
 public class AutoMapperInstaller : IWindsorInstaller
 {
    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        Mapper.Initialize(x => x.ConstructServicesUsing(container.Resolve));

        RegisterProfilesAndResolvers(container);
        RegisterMapperEngine(container);
    }

    private void RegisterMapperEngine(IWindsorContainer container)
    {
        container.Register(
            Component.For<IMappingEngine>().Instance(Mapper.Engine)
        );
    }

    private void RegisterProfilesAndResolvers(IWindsorContainer container)
    {
        // register value resolvers
        container.Register(AllTypes.FromAssembly(Assembly.GetExecutingAssembly()).BasedOn<IValueResolver>());

        // register profiles
        container.Register(AllTypes.FromThisAssembly().BasedOn<Profile>());
        var profiles = container.ResolveAll<Profile>();

        foreach (var profile in profiles)
            Mapper.AddProfile(profile);
    }
 }
}

Global.asaxメソッドBootstrapContainerから呼び出すメソッドがありApplication_Startます。

private static readonly IWindsorContainer container = new WindsorContainer();

    public IWindsorContainer Container
    {
        get { return container; }
    }

    private static void BootstrapContainer()
    {
        container.Install(FromAssembly.This());
    }

私が得る例外は次のとおりです。Trying to map xxx to yyyModel. Missing type map configuration or unsupported mapping. Exception of type 'AutoMapper.AutoMapperMappingException' was thrown.

インストーラーをデバッグしましたが、この行はもう機能していないと思いますContainer.Register(AllTypes.FromThisAssembly().BasedOn<Profile>());

プロファイル(次の行)を解決しようとすると、0個のプロファイルが返されます。

私はこれら2つのツールの専門家ではなく、これがWindsorでAutoMapperを初期化するための最良の方法であるかどうかはわかりませんが、これまでは機能していました。

なぜこれが機能しなくなったのか、何か考えはありますか?

4

2 に答える 2

3

これは、ウィンザーでの既知の文書化された重大な変更です(詳細breakingchanges.txtについてはを参照してください)。

Profileつまり、プロファイルをとして登録する必要があるため、プロファイルを解決する場合ですProfile

Container.Register(AllTypes.FromThisAssembly().BasedOn<Profile>().WithServiceBase());
于 2011-12-18T11:36:34.890 に答える
0

私にとってこのコードは機能しました:

public class AutoMapperInstaller : IWindsorInstaller
{
    public void Install(IWindsorContainer container, IConfigurationStore store)
        {
            // Register all mapper profiles
            container.Register(
                Classes.FromAssemblyInThisApplication(GetType().Assembly)
                .BasedOn<Profile>().WithServiceBase());
                
            // Register IConfigurationProvider with all registered profiles
            container.Register(Component.For<IConfigurationProvider>().UsingFactoryMethod(kernel =>
            {
                return new MapperConfiguration(configuration =>
                {
                    kernel.ResolveAll<Profile>().ToList().ForEach(configuration.AddProfile);
                });
            }).LifestyleSingleton());
            
            // Register IMapper with registered IConfigurationProvider
            container.Register(
                Component.For<IMapper>().UsingFactoryMethod(kernel =>
                    new Mapper(kernel.Resolve<IConfigurationProvider>(), kernel.Resolve)));
        }
}
于 2020-09-17T14:24:36.190 に答える