TypeAccessor: Duplicate type name within an assembly.
От: Sashko Россия http://www.dc.baika.ru/
Дата: 24.01.06 09:31
Оценка: 63 (1)
Может это уже известная проблеба. TypeAccessor пытается второй раз создать то же тип

namespace BltGym
{
    public class Gym
    {
        public abstract class Entity
        {
            public abstract int Id { get; set; }
            public abstract String Name { get; set; }

            public static Entity CreateInstance() { return TypeAccessor<Entity>.CreateInstanceEx(); }
        }
        
        public abstract class EntityAccessor : DataAccessor<Entity>
        {
            public new abstract int Insert(Entity entiry);
            
            public static EntityAccessor CreateInstance(DbManager dbManager)
            {
                return DataAccessor.CreateInstance<EntityAccessor>(dbManager);
            }
        }

        public static void Main(string[] args)
        {
            TypeFactory.SetGlobalAssembly(@"c:\tmp\BltGym.dll");

            DbManager.AddDataProvider(/*...*/);
            DbManager.AddConnectionString(/*...*/);

            DbManager db = new DbManager();

            Entity entity = Entity.CreateInstance();
            EntityAccessor accessor = EntityAccessor.CreateInstance(db);

            accessor.Insert(entity);
        }
    }
}


в результате получам

TypeBuilderException
Could not build the 'BltGym.Gym.BLToolkitExtension.Entity' type: Duplicate type name within an assembly.


То есть что происходит. Entity entity = Entity.CreateInstance() инициирует вызов

TypeAccessor.GetAccessor(originalType = typeof(BltGym.Gym+Entity))

который зоздаёт BltGym.Gym.BLToolkitExtension.Entity а затем BltGym.Gym.BLToolkitExtension.Entity.TypeAccesssor. Далее accessor.Insert(entity) внутри себя создаёт ObjectMapper для entity (типа BltGym.Gym.BLToolkitExtension.Entity) что приводит к вызову

TypeAccessor.GetAccessor(originalType = typeof(BltGym.Gym.BLToolkitExtension.Entity))

в результате второй раз создаётся тип BltGym.Gym.BLToolkitExtension.Entity.TypeAccessor
Re: TypeAccessor: Duplicate type name within an assembly.
От: IT Россия linq2db.com
Дата: 24.01.06 14:52
Оценка:
Здравствуйте, Sashko, Вы писали:

S>Может это уже известная проблеба. TypeAccessor пытается второй раз создать то же тип


SetGlobalAssembly пока является прототипом и предназначена по идее для сохранения сгенерированных классов в одном месте и их дальнейшего повторного использования.

Но за найдённый глюк спасибо.
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: TypeAccessor: Duplicate type name within an assembly.
От: Sashko Россия http://www.dc.baika.ru/
Дата: 25.01.06 02:30
Оценка:
Здравствуйте, IT, Вы писали:

S>>Может это уже известная проблеба. TypeAccessor пытается второй раз создать то же тип

IT>SetGlobalAssembly пока является прототипом и предназначена по идее для сохранения сгенерированных классов в одном месте и их дальнейшего повторного использования.

Я её вызывал только что б сразу стало видно что один и тот же TypeAccessor создаётся второй раз. Точнее было так, удивился что второй раз создался TypeAccessor для обвёртки над моим абстрактным типом, и всё это работало, так как лежало в разных assembly и следовательно полные имена типов были разные, вот и решил проверить что же будет если все типы будут создаваться в одной assembly.
Re[3]: TypeAccessor: Duplicate type name within an assembly.
От: IT Россия linq2db.com
Дата: 25.01.06 02:45
Оценка:
Здравствуйте, Sashko, Вы писали:

S>Я её вызывал только что б сразу стало видно что один и тот же TypeAccessor создаётся второй раз. Точнее было так, удивился что второй раз создался TypeAccessor для обвёртки над моим абстрактным типом, и всё это работало, так как лежало в разных assembly и следовательно полные имена типов были разные, вот и решил проверить что же будет если все типы будут создаваться в одной assembly.


Буду разбираться.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[4]: TypeAccessor: Duplicate type name within an assembly.
От: Sashko Россия http://www.dc.baika.ru/
Дата: 25.01.06 03:00
Оценка: 42 (1)
Здравствуйте, IT, Вы писали:

IT>Буду разбираться.


Дело оказалось за малым, нужно было сразу посмотреть мне повнимательней

        public static TypeAccessor GetAccessor(Type originalType)
        {
            // ...
                    if (accessor == null)
                    {
                        Type type = originalType.IsAbstract && !originalType.IsSealed?
                            TypeFactory.GetType(originalType, new AbstractClassBuilder()):
                            originalType;

                        Type accessorType = 
                            TypeFactory.GetType(originalType, new TypeAccessorBuilder(type, originalType));

                        _accessors[originalType] = accessor = (TypeAccessor)Activator.CreateInstance(accessorType);

                        if (type.IsAbstract)
                            _accessors[type] = accessor;
                    }

поправить на

                        _accessors[type] = accessor = (TypeAccessor)Activator.CreateInstance(accessorType);

                        if (originalType.IsAbstract)
                            _accessors[originalType] = accessor;
Re[5]: TypeAccessor: Duplicate type name within an assembly.
От: IT Россия linq2db.com
Дата: 25.01.06 03:07
Оценка:
Здравствуйте, Sashko, Вы писали:

S>Дело оказалось за малым, нужно было сразу посмотреть мне повнимательней


Уже тоже нашёл

Лучше так.

                        _accessors[originalType] = accessor = (TypeAccessor)Activator.CreateInstance(accessorType);

                        if (originalType != type)
                            _accessors[type] = accessor;
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.