Exemplo n.º 1
0
 /// <summary>
 /// Creates a new reference-dehydrating decorator.
 /// </summary>
 /// <param name="inner">The inner factory to use for the actual storage.</param>
 public DehydratingReadRepositoryFactory([NotNull] IReadRepositoryFactory inner)
 {
     _inner = inner;
 }
 public static object Create([NotNull] this IReadRepositoryFactory repositoryFactory, [NotNull] Type entityType) =>
 CreateReadMethod.MakeGenericMethod(entityType).Invoke(repositoryFactory, null);
Exemplo n.º 3
0
 private static async Task <object> ResolveOrRecurseAsync([NotNull] this PropertyInfo prop, [NotNull] Type referenceType, [NotNull] object obj, [NotNull] IReadRepositoryFactory repositoryFactory)
 {
     if (prop.HasAttribute <ResolveAttribute>())
     {
         return(await DehydrationUtils.ResolveAsync((dynamic)obj, (dynamic)repositoryFactory.Create(referenceType)));
     }
     else if (prop.HasAttribute <ResolveReferencesAttribute>())
     {
         return(await obj.ResolveReferencesAsync(referenceType, repositoryFactory));
     }
     return(obj);
 }
Exemplo n.º 4
0
        private static async Task <object> ResolveReferencesAsync([NotNull] this object obj, [NotNull] Type type, [NotNull] IReadRepositoryFactory repositoryFactory)
        {
            if (!type.IsPoco())
            {
                return(obj);
            }

            var newObj = Activator.CreateInstance(type);

            foreach (var prop in type.GetWritableProperties())
            {
                var propertyValue = prop.GetValue(obj, null);
                if (propertyValue == null)
                {
                    continue;
                }

                if (prop.IsCollection())
                {
                    var referenceType  = prop.GetGenericArg();
                    var collectionType = typeof(List <>).MakeGenericType(referenceType);

                    object resolvedRefs = Activator.CreateInstance(collectionType);
                    prop.SetValue(newObj, resolvedRefs, null);

                    dynamic resolvedRefsDynamic = resolvedRefs;
                    foreach (object dehydratedRef in (IEnumerable)propertyValue)
                    {
                        if (dehydratedRef != null)
                        {
                            resolvedRefsDynamic.Add((dynamic)
                                                    await prop.ResolveOrRecurseAsync(referenceType, dehydratedRef, repositoryFactory));
                        }
                    }
                }
                else
                {
                    var referenceType = prop.PropertyType;
                    var dehydratedRef = propertyValue;

                    prop.SetValue(
                        obj: newObj,
                        value: await prop.ResolveOrRecurseAsync(referenceType, dehydratedRef, repositoryFactory),
                        index: null);
                }
            }
            return(newObj);
        }
Exemplo n.º 5
0
 public static async Task <T> ResolveReferencesAsync <T>([NotNull] this T obj, [NotNull] IReadRepositoryFactory repositoryFactory) =>
 (T) await ResolveReferencesAsync(obj, typeof(T), repositoryFactory);
Exemplo n.º 6
0
 public static T ResolveReferences <T>([NotNull] this T obj, [NotNull] IReadRepositoryFactory repositoryFactory) =>
 (T)ResolveReferences(obj, typeof(T), repositoryFactory);
Exemplo n.º 7
0
 /// <summary>
 /// Creates a new reference-dehydrating decorator.
 /// </summary>
 /// <param name="inner">The inner repository to use for the actual storage.</param>
 /// <param name="repositoryFactory">Used to aquire additional repositories for resolving references.</param>
 public DehydratingCrudRepository([NotNull] ICrudRepository <TEntity> inner,
                                  [NotNull] IReadRepositoryFactory repositoryFactory) : base(inner)
 {
     _repositoryFactory = repositoryFactory;
     Inner = inner;
 }