Как настроить AutoMapper однажды на AppDomain

У подобного жулику сообщества разработчиков есть определенная одержимость углом обзора, алгоритмами поля зрения.

Вот ссылка на подобную жулику статью Wiki о предмете: http://roguebasin.roguelikedevelopment.org/index.php?title=Field_of_Vision

Для моей подобной жулику игры, я реализовал алгоритм построения теней ( http://roguebasin.roguelikedevelopment.org/index.php?title=Shadow_casting ) в Python. Это было немного сложно для соединения, но работало обоснованно эффективно (даже в чистом Python) и генерировало хорошие результаты.

"Разрешающее Поле зрения", кажется, завоевывает популярность также: http://roguebasin.roguelikedevelopment.org/index.php?title=Permissive_Field_of_View

20
задан KevDog 29 September 2009 в 18:27
поделиться

3 ответа

What we do is create a static class, something like BootStrapper, and put the initialization code in a static method in there. We're doing profiles, so you don't see much in there. Global.asax will call that at startup, domain will use it (since the configuration is singleton), and unit tests that need it call the BootStrapper.Configure() in their setup.

One final thing we do is keep a flag around on the bootstrapper, and set it to true when we configure. That way, configuration only executes once per AppDomain. That means once at startup of the global.asax (Application_Start), and once when we run unit tests.

HTH

28
ответ дан 30 November 2019 в 00:01
поделиться

Я также использую загрузчик для обработки такого рода задач запуска. На самом деле, я использую цепочку бутстрепперов, потому что я такой сумасшедший. С точки зрения автоматизации, мы обнаружили, что было намного проще создать несколько классов AutoMappingBuddy и украсить их атрибутом. Затем мы подключаем мапперы через несколько вызовов отражения (недешево, но они срабатывают только один раз). Это решение было обнаружено после того, как нам надоело находить проблему с AutoMapper в строке 841 строкового файла с более чем 1200.


Я думал опубликовать код, но не могу назвать это таким пурпурным. В любом случае, вот оно:

Во-первых, простой интерфейс для AutoMappingBuddies:

public interface IAutoMappingBuddy
{
    void CreateMaps();
}

Во-вторых, небольшой атрибут, обеспечивающий некую связь:

public class AutoMappingBuddyAttribute : Attribute
{
    public Type MappingBuddy { get; private set; }

    public AutoMappingBuddyAttribute(Type mappingBuddyType)
    {
        if (mappingBuddyType == null) throw new ArgumentNullException("mappingBuddyType");
        MappingBuddy = mappingBuddyType;
    }

    public IAutoMappingBuddy CreateBuddy()
    {
        ConstructorInfo ci = MappingBuddy.GetConstructor(new Type[0]);
        if (ci == null)
        {
            throw new ArgumentOutOfRangeException("mappingBuddyType", string.Format("{0} does not have a parameterless constructor."));
        }
        object obj = ci.Invoke(new object[0]);
        return obj as IAutoMappingBuddy;
    }
}

В-третьих, AutoMappingEngine. Здесь происходит волшебство:

public static class AutoMappingEngine
{
    public static void CreateMappings(Assembly a)
    {
        Dictionary<Type, IAutoMappingBuddy> mappingDictionary = GetMappingDictionary(a);
        foreach (Type t in a.GetTypes())
        {
            var amba =
                t.GetCustomAttributes(typeof (AutoMappingBuddyAttribute), true).OfType<AutoMappingBuddyAttribute>().
                    FirstOrDefault();
            if (amba!= null && !mappingDictionary.ContainsKey(amba.MappingBuddy))
            {
                mappingDictionary.Add(amba.MappingBuddy, amba.CreateBuddy());
            }
        }
        foreach (IAutoMappingBuddy mappingBuddy in mappingDictionary.Values)
        {
            mappingBuddy.CreateMaps();
        }
    }

    private static Dictionary<Type, IAutoMappingBuddy> GetMappingDictionary(Assembly a)
    {
        if (!assemblyMappings.ContainsKey(a))
        {
            assemblyMappings.Add(a, new Dictionary<Type, IAutoMappingBuddy>());
        }
        return assemblyMappings[a];
    }

    private static Dictionary<Assembly, Dictionary<Type, IAutoMappingBuddy>> assemblyMappings = new Dictionary<Assembly, Dictionary<Type, IAutoMappingBuddy>>();
}

Как бы то ни было, через час или около того,

4
ответ дан 30 November 2019 в 00:01
поделиться

Я попробовал приведенный выше код, но не смог заставить его работать. Я немного изменил его, как показано ниже. Я думаю, что все, что осталось сделать, это вызвать его через загрузчик из Global.asax. Надеюсь, это поможет.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;

using AutoMapper;

namespace Automapping
{
    public class AutoMappingTypePairing
    {
        public Type SourceType { get; set; }
        public Type DestinationType { get; set; }
    }

    public class AutoMappingAttribute : Attribute 
    {
        public Type SourceType { get; private set; }

        public AutoMappingAttribute(Type sourceType)
        {
            if (sourceType == null) throw new ArgumentNullException("sourceType");
            SourceType = sourceType; 
        }
    }

    public static class AutoMappingEngine
    {
        public static void CreateMappings(Assembly a)
        {
            IList<AutoMappingTypePairing> autoMappingTypePairingList = new List<AutoMappingTypePairing>();

            foreach (Type t in a.GetTypes())
            {
                var amba = t.GetCustomAttributes(typeof(AutoMappingAttribute), true).OfType<AutoMappingAttribute>().FirstOrDefault();

                if (amba != null)
                {
                    autoMappingTypePairingList.Add(new AutoMappingTypePairing{ SourceType = amba.SourceType, DestinationType = t});
                }
            } 

            foreach (AutoMappingTypePairing mappingPair in autoMappingTypePairingList) 
            {
                Mapper.CreateMap(mappingPair.SourceType, mappingPair.DestinationType);
            }
        }
    }
}

И я использую это так, чтобы связать источник с парой назначения:

[AutoMapping(typeof(Cms_Schema))]
public class Schema : ISchema
{
    public Int32 SchemaId { get; set; }
    public String SchemaName { get; set; }
    public Guid ApplicationId { get; set; }
}

Затем, чтобы создать сопоставления автоматически, я делаю следующее:

        Assembly assembly = Assembly.GetAssembly(typeof([ENTER NAME OF A TYPE FROM YOUR ASSEMBLY HERE]));

        AutoMappingEngine.CreateMappings(assembly);
4
ответ дан 30 November 2019 в 00:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: