Breeze# для Xamarin.Forms (UWP, Droid и iOS)?

На их веб-сайте Xamarin отображается как один из их клиентов, но я не могу установите пакет Breeze.Sharp, который также помечен тегом Xamarin< /эм>.

Он устанавливается в проект PCL, но для его работы мне нужно установить его во все проекты платформы. Когда я пытаюсь это сделать, я получаю следующие ошибки:

iOS/Андроид:

Не удалось установить пакет «Microsoft.AspNet.WebApi.Client 5.2.3». Вы пытаетесь установить этот пакет в проект, предназначенный для «Xamarin.iOS, версия = v1.0», но пакет не содержит ссылок на сборки или файлов содержимого, совместимых с этой платформой. Для получения дополнительной информации свяжитесь с автором пакета.

UWP:

Пакет Breeze.Sharp 0.6.0.9 несовместим с uap10.0 (UAP, Version=v10.0) / win10-x86-aot. Пакет Breeze.Sharp 0.6.0.9 поддерживает: net (.NETFramework,Version=v0.0) Один или несколько пакетов несовместимы с UAP,Version=v10.0 (win10-x86-aot).


person Shimmy Weitzhandler    schedule 29.06.2017    source источник
comment
Я попробовал ваш подход с тем же результатом. Итак, я создал Portable-сборку со ссылкой на BreezeSharp. Проблема, с которой я столкнулся сейчас, заключается в выполнении Configuration.Instance.ProbeAssemblies в этой общей библиотеке, поскольку у меня нет доступа к свойству Type.Assembly. ОБНОВЛЕНИЕ: я решил свою проблему с передачей сборки, полученной в проекте Android, в мою общую библиотеку. Может быть, это не элегантный подход, но решить мою проблему. Если у кого-то есть лучший подход, я буду признателен.   -  person Leonardo Neninger    schedule 29.06.2017
comment
Как насчет УВП? У вас тоже получилось работать с Breeze#?   -  person Shimmy Weitzhandler    schedule 30.06.2017
comment
Я работаю только с Android. Поскольку я использую Portable Class Library, я предполагаю, что между платформами нет различий (или они незначительны).   -  person Leonardo Neninger    schedule 01.07.2017
comment
@LeonardoNeninger, как вы видели в моем посте, ошибка, которую я получаю с UWP, отличается. Я использую XF для трех платформ: Droid, iOS и UWP. Я могу использовать Breeze# только в том случае, если он поддерживает их все.   -  person Shimmy Weitzhandler    schedule 02.07.2017
comment
Вы уже пытались создать отдельную переносимую библиотеку классов, как я предложил?   -  person Leonardo Neninger    schedule 03.07.2017
comment
В UWP работает? Я могу использовать его, только если он работает на всех трех платформах.   -  person Shimmy Weitzhandler    schedule 06.07.2017


Ответы (2)


Я решаю таким образом.
1. Создайте новую переносимую библиотеку классов
2. Добавьте BreezeSharp в качестве ссылки на новую переносимую библиотеку классов (Nuget)
3. Добавьте новую библиотеку классов в качестве ссылки на ваши конкретные проекты платформы (Android, iOS). В моем случае только Android.
4. В Portable Library. Создайте статический класс, например: Configs.
5. Проект Android -> MainActivity.OnCreate

Configs.ModelAssembly = typeof(Customer).Assembly;
  1. Реализуйте DataService Breeze в переносимой библиотеке классов. бывший:

public abstract class BaseDataService<T> where T : BaseEntity
    {
        public static string Metadata { get; protected set; }
        public string EntityName { get; protected set; }
        public string EntityResourceName { get; protected set; }
        public EntityManager EntityManager { get; set; }
        public string DefaultTargetMethod { get; protected set; }
        static BaseDataService()
        {
            Constants = ConstantsFactory.Get;
            try
            {
                var metadata = GetMetadata();
                metadata.Wait();
                Metadata = metadata.Result;

            }
            catch (Exception ex)
            {
                var b = 0;
            }
        }


        public BaseDataService(string resourceName, string targetMethod = null)
        {
            var modelType = typeof(Customer);
            Configuration.Instance.ProbeAssemblies(ConstantsFactory.BusinessAssembly);
            try
            {
                this.EntityName = typeof(T).FullName;
                this.EntityResourceName = resourceName;

                this.DefaultTargetMethod = (string.IsNullOrWhiteSpace(targetMethod) ? "GetAll" : targetMethod);

                var dataService = new DataService($"{ConstantsFactory.Get.BreezeHostUrl}{this.EntityResourceName}", new CustomHttpClient());
                dataService.HasServerMetadata = false;
                var metadataStore = new MetadataStore();
                var namingConvention = NamingConvention.CamelCaseProperties; /*metadataStore.NamingConvention;*/ /*NamingConvention.Default;*/// new NamingConvention()
                namingConvention = namingConvention.WithClientServerNamespaceMapping(
                    new Dictionary<string, string> { { "Business.DomainModels", "DomainModel.Models" } }
                    );

                metadataStore.NamingConvention = namingConvention;

                metadataStore.ImportMetadata(Metadata, true);

                this.EntityManager = new EntityManager(dataService, metadataStore);
                this.EntityManager.MetadataStore.AllowedMetadataMismatchTypes = MetadataMismatchTypes.AllAllowable;
                // Attach an anonymous handler to the MetadataMismatch event
                this.EntityManager.MetadataStore.MetadataMismatch += (s, e) =>
                {
                    // Log the mismatch
                    var message = string.Format("{0} : Type = {1}, Property = {2}, Allow = {3}",
                                                e.MetadataMismatchType, e.StructuralTypeName, e.PropertyName, e.Allow);

                    // Disallow missing navigation properties on the TodoItem entity type
                    if (e.MetadataMismatchType == MetadataMismatchTypes.MissingCLRNavigationProperty &&
                        e.StructuralTypeName.StartsWith("TodoItem"))
                    {
                        e.Allow = false;
                    }
                };
            }
            catch (Exception ex)
            {
                var b = 0;
            }
        }

        public async Task<List<T>> GetAll(string targetMethod = null)
        {
            var internalTargetMethod = (string.IsNullOrWhiteSpace(targetMethod) ? this.DefaultTargetMethod : targetMethod);
            var query = new EntityQuery<T>(internalTargetMethod);
            var qr = await this.EntityManager.ExecuteQuery(query);
            var result = qr.ToList();
            return result;
        }

        public void Delete(T entity)
        {
            entity.EntityAspect.Delete();
        }


        private static async Task<string> GetMetadata()
        {
            var client = new HttpClient();
            var metadata = await client.GetStringAsync(ConstantsFactory.Get.MetadataUrl).ConfigureAwait(false);
            var ret = JsonConvert.DeserializeObject<MetadataModel>(metadata);
            return ret.metadata;
        }


    }

  1. Создайте CustomerService, если вам нужно как

public class CustomerDataService : BaseDataService<Customer>
    {
        public CustomerDataService(IConstants constants) : base("Customers")
        {
            
        }
    }

person Leonardo Neninger    schedule 29.06.2017
comment
Я ценю ваши усилия, но мне нужно решение, подходящее для UWP, Android и iOS. - person Shimmy Weitzhandler; 24.07.2017

В электронном письме, которое я получил от IdeaBlade, изобретателя Breeze#, он сказал, что, хотя Breeze# не умер, он привлек гораздо меньше внимания сообщества по сравнению с BreezeJS, поэтому они предпочитают вкладывать свои ресурсы в библиотеку JS.

Пока я просто буду использовать TrackableEntities от @ЭнтониСнид. Хотя он и не такой всеобъемлющий, как Breeze#, часть работы он выполняет хорошо.

person Shimmy Weitzhandler    schedule 09.07.2017