Breeze# 用于 Xamarin.Forms(UWP、Droid 和 iOS)?

Posted

技术标签:

【中文标题】Breeze# 用于 Xamarin.Forms(UWP、Droid 和 iOS)?【英文标题】:Breeze# for Xamarin.Forms (UWP, Droid & iOS)? 【发布时间】:2017-12-02 14:25:33 【问题描述】:

在their website 中,Xamarin 显示为他们的客户之一,但我无法安装包Breeze.Sharp,它也被标记为 Xamarin

它确实安装到了 PCL 项目中,但为了让它工作,我需要将它安装到所有平台项目中。当我尝试这样做时,我收到以下错误:

ios/安卓:

无法安装包“Microsoft.AspNet.WebApi.Client 5.2.3”。您正在尝试将此包安装到以“Xamarin.iOS,Version=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)。

【问题讨论】:

我尝试了您的方法,结果相同。因此,我参考 BreezeSharp 创建了一个便携式程序集。我现在面临的问题是在该共享库中执行 Configuration.Instance.ProbeAssemblies,因为我无权访问 Type.Assembly 属性。更新:我解决了将 android 项目中的程序集传递到我的共享库的问题。也许不是一种优雅的方法,但可以解决我的问题。如果有人有更好的方法,我将不胜感激。 UWP 怎么样?您是否也将其与 Breeze# 一起使用? 我只使用 Android。当我使用可移植类库时,我假设平台之间没有差异(或只有一点差异) @LeonardoNeninger,正如您在我的帖子中看到的,我在使用 UWP 时遇到的错误是不同的。我正在使用 XF 来定位 3 个平台:Droid、iOS 和 UWP。如果 Breeze# 都支持,我只能使用它们。 您是否已经尝试按照我的建议创建一个分离的可移植类库? 【参考方案1】:

我就是这样解决的。 1. 创建新的可移植类库 2. 添加 BreezeSharp 作为新 Portable Class Library(Nuget) 的参考 3. 添加新类库作为您特定平台项目(Android、iOS)的参考。就我而言,只有 Android。 4. 在便携式图书馆。创建一个静态类 ex:Configs. 5. Android 项目 -> MainActivity.OnCreate

Configs.ModelAssembly = typeof(Customer).Assembly;
    在可移植类库中实现 Breeze 的 DataService。 例如:

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.BreezeHostUrlthis.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;
        


    
    根据需要创建 CustomerService

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

【讨论】:

感谢您的努力,但我正在寻找涵盖 UWP、Android 和 iOS 的解决方案。【参考方案2】:

在我从 Breeze# 的发明者 IdeaBlade 收到的一封电子邮件中,他说虽然 Breeze# 并没有死,但与 BreezeJS 相比,它所淹没的社区注意力要少得多,因此他们更愿意将资源投入到 JS 库中.

现在,我将使用 @TrackableEntities by @AnthonySneed。虽然不如 Breeze# 全面,但可以很好地完成部分工作。

【讨论】:

以上是关于Breeze# 用于 Xamarin.Forms(UWP、Droid 和 iOS)?的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin.Forms / Xamarin.Android的任何插件用于选择保存文件的目录?

用于绑定的 Xamarin.Forms MarkupExtension

Xamarin.Forms WebView 不适用于 WebRTC

用于 Xamarin.Forms 的带有标头 (LongListSelector) 的 ListView

Xamarin.Forms 中用于 .Net Standard 2.0 的 ModernHttpClient

开源 XFControls , 用于 Xamarin.Forms 的自定义控件集