Пример #1
0
        internal TO GetInternal <TO>(Guid _uid, IXObjectFactory <TKind> _factory) where TO : ClientXObject <TKind>
        {
            if (_factory == null && typeof(TO).IsAbstract)
            {
                var xFactoryAttribute = typeof(TO).GetCustomAttributes(typeof(XFactoryAttribute), true).Cast <XFactoryAttribute>().SingleOrDefault();
                if (xFactoryAttribute == null)
                {
                    throw new ApplicationException("Can't instantiate abstract type");
                }
                _factory = (IXObjectFactory <TKind>)Activator.CreateInstance(xFactoryAttribute.FactoryType);
            }

            ClientXObjectDescriptor <TKind> descriptor;

            if (m_descriptors.TryGetValue(_uid, out descriptor))
            {
                return(descriptor.Get <TO>(_factory));
            }
            var collectionOwnerUid = m_transport.GetСollectionOwnerUid(_uid);

            descriptor = new ClientXObjectDescriptor <TKind>(_uid, this, collectionOwnerUid);
            m_descriptors.Add(_uid, descriptor);
            var result = descriptor.Get <TO>(_factory);

            return(result);
        }
Пример #2
0
        public TO Get <TO>(IXObjectFactory <TKind> _factory) where TO : ClientXObject <TKind>
        {
            ClientXObject <TKind> result;
            var type = typeof(TO);

            if (!m_instances.TryGetValue(type, out result))
            {
                if (_factory == null)
                {
                    if (type.IsAbstract)
                    {
                        throw new ApplicationException("Can't instantiate abstract type, please init _factory arg");
                    }

                    result = (ClientXObject <TKind>)Activator.CreateInstance(typeof(TO));
                    if (m_notInitialized)
                    {
                        Kind = m_client.KindToIntInternal(result.Kind);
                    }
                }
                else
                {
                    if (m_notInitialized)
                    {
                        Kind = m_client.KindToIntInternal(_factory.Kind);
                    }
                    result = (ClientXObject <TKind>)_factory.CreateInstance(m_client.IntToKindInternal(Report.Kind));
                    var newType = result.GetType();
                    ClientXObject <TKind> existed;
                    if (m_instances.TryGetValue(newType, out existed))
                    {
                        m_instancesCounter[existed]++;
                        return((TO)existed);
                    }
                    m_instances.Add(type, result);
                    type = newType;
                }
                var child = result as IClientXChildObject <TKind>;
                if (child != null)
                {
                    child.SetParent(CollectionOwnerUid);
                }
                result.SetUid(Report.Uid);
                result.SetClientInternal(m_client);
                result.ApplyChanges(Report, true);
                result.Changed += XObjectChanged;
                m_instances.Add(type, result);
                m_instancesCounter.Add(result, 1);
                result.OnInstantiationFinished();
            }
            else
            {
                m_instancesCounter[result]++;
            }
            return((TO)result);
        }
Пример #3
0
        internal TO GetInternal <TO>(Guid _uid, IXObjectFactory <TKind> _factory, Guid _collectionOwnerUid)
            where TO : ClientXObject <TKind>
        {
            ClientXObjectDescriptor <TKind> descriptor;
            TO result;

            if (!m_descriptors.TryGetValue(_uid, out descriptor))
            {
                descriptor = new ClientXObjectDescriptor <TKind>(_uid, this, _collectionOwnerUid);
                m_descriptors.Add(_uid, descriptor);
                result = descriptor.Get <TO>(_factory);
            }
            else
            {
                if (!descriptor.ContainsInstanceOf(out result))
                {
                    result = descriptor.Get <TO>(_factory);
                }
            }
            return(result);
        }
Пример #4
0
 internal XRef(IXObjectFactory <TKind> _factory)
 {
     m_factory = _factory;
 }
Пример #5
0
 internal XCollection(IXObjectFactory <TKind> _factory)
 {
     m_factory = _factory;
 }