UWP 模板 10 和服务依赖注入 (MVVM),而非 WPF

2024-01-23

我花了两个多星期的时间搜索 google、bing、stackoverflow 和 msdn 文档,试图找出如何为我正在开发的移动应用程序进行正确的依赖项注入。需要明确的是,我每天都在网络应用程序中进行 DI。我不需要关于什么、谁以及为什么 DI 重要的速成课程。我知道它是,并且我总是拥抱它。

我需要了解的是它在移动应用程序世界中如何工作,特别是 UWP Template 10 移动应用程序。

从我过去的经历来看,在 .net/Asp 应用程序中,我可以“RegisterType(new XYZ).Singleton() blah”{请原谅语法;只是 App_Start.ConfigureServices 中的一个示例}。这在 .netcore 中的工作原理几乎相同,只是进行了一些语法更改。

我的问题是现在我试图将我的 api 提供给需要消化我的 IXYZ 服务的 UWP 应用程序。我绝不认为他们应该每次都“新建”一个实例。必须有一种方法将其注入到 UWP 端的容器中;我觉得我错过了一些东西very过程简单。

这是我的代码:

应用程序.xaml.cs

public override async Task OnStartAsync(StartKind startKind, IActivatedEventArgs args)
    {
        // TODO: add your long-running task here

        //if (args.Kind == ActivationKind.LockScreen)
        //{

        //}
        RegisterServices();
        await NavigationService.NavigateAsync(typeof(Views.SearchCompanyPage));

    }

public static IServiceProvider Container { get; private set; }

private static void RegisterServices()
{
    var services = new ServiceCollection();
    services.AddSingleton<IXYZ, XYZ>();
    Container = services.BuildServiceProvider();
}

MainPage.xaml.cs:

public MainPage()
{
   InitializeComponent();
   NavigationCacheMode = NavigationCacheMode.Enabled;
}

主页视图模型:

public class MainPageViewModel : ViewModelBase
{
    private readonly IXYZ _xyz;
    public MainPageViewModel(IXYZ xyz)
    {
        //Stuff
        _xyz= xyz;
    }

}

我现在收到错误:无法构造 XAML MainPage...ViewModel 类型。为了在 XAML 中构造,类型不能是抽象、接口嵌套泛型或结构,并且必须具有公共默认构造函数。

我愿意使用任何品牌的 IoC 容器,但我需要的是如何在 UWP 应用程序中正确使用 DI 服务的示例。关于 DI 的 99.9% 的问题都与视图(即 Prism?)有关,而不仅仅是服务的简单 DI(即 DataRepo;又名 API/DataService)。

再次,我觉得我错过了一些明显的东西,需要朝正确的方向推动。有人可以向我展示一个示例项目、基本代码或关于我不应该成为一名程序员的基本鞭打吗?请不要这样做(我不知道我的自尊心是否可以接受)。


您可以尝试 Microsoft.Hosting.Extensions 就像 ASP.NET 一样,Xamarin.Forms 上有一个实现詹姆斯·蒙特马尼奥 https://montemagno.com/add-asp-net-cores-dependency-injection-into-xamarin-apps-with-hostbuilder/,它也可以在我尝试过的 UWP 中使用,并且运行完美。您必须更改某些部件才能使其正常工作。

在 OnLaunched 方法中添加 Startup.Init();

    public static class Startup
    {
        public static IServiceProvider ServiceProvider { get; set; }
        public static void Init()
        {
            StorageFolder LocalFolder = ApplicationData.Current.LocalFolder;
            var configFile = ExtractResource("Sales.Client.appsettings.json", LocalFolder.Path);

            var host = new HostBuilder()
                        .ConfigureHostConfiguration(c =>
                        {
                            // Tell the host configuration where to file the file (this is required for Xamarin apps)
                            c.AddCommandLine(new string[] { $"ContentRoot={LocalFolder.Path}" });

                            //read in the configuration file!
                            c.AddJsonFile(configFile);
                        })
                        .ConfigureServices((c, x) =>
                        {
                            // Configure our local services and access the host configuration
                            ConfigureServices(c, x);
                        }).
                        ConfigureLogging(l => l.AddConsole(o =>
                        {
                            //setup a console logger and disable colors since they don't have any colors in VS
                            o.DisableColors = true;
                        }))
                        .Build();

            //Save our service provider so we can use it later.
            ServiceProvider = host.Services;
        }

        static void ConfigureServices(HostBuilderContext ctx, IServiceCollection services)
        {
            //ViewModels
            services.AddTransient<HomeViewModel>();
            services.AddTransient<MainPageViewModel>();
        }

        static string ExtractResource(string filename, string location)
        {
            var a = Assembly.GetExecutingAssembly();
            
            using (var resFilestream = a.GetManifestResourceStream(filename))
            {
                if (resFilestream != null)
                {
                    var full = Path.Combine(location, filename);

                    using (var stream = File.Create(full))
                    {
                        resFilestream.CopyTo(stream);
                    }
                }
            }
            return Path.Combine(location, filename);
        }
    }

注入 ViewModel https://i.stack.imgur.com/0vKCx.png也是可能的,这非常好。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UWP 模板 10 和服务依赖注入 (MVVM),而非 WPF 的相关文章

  • 春天。使用java配置解决循环依赖而不使用@Autowired

    我有循环依赖和java配置 虽然使用 xml 配置解决它非常简单 但如果没有 Autowired 我无法使用 java 配置解决它 豆子 public class A private B b public B getB return b p
  • 如何使用 Ioc Unity 注入依赖属性

    我有以下课程 public interface IServiceA string MethodA1 public interface IServiceB string MethodB1 public class ServiceA IServ
  • MEF 错误,是循环依赖,现在是其他错误

    由于我的应用程序架构发生变化 我最近出现了循环依赖关系 该应用程序依赖于通过 MEF 加载插件的插件管理器 一切都工作正常 因为它看起来像这样 model cs Export Model public class Model public
  • Nestjs全局pubsub实例和依赖注入

    我遵循了有关 pubsub subscriptions 的 Nestjs DOCS 根据示例 pubsub 在给定解析器的顶部初始化为 const pubSub new PubSub 后来文档说 我们在这里使用了本地 PubSub 实例 相
  • HidDevice.FromIdAsync 通过读写返回 null

    我正在尝试将库从经典桌面移植到 UWP 除了一件事之外 一切都按计划进行 当我尝试打开与设备 Wiimote 的 HID 连接时 如果权限处于读写状态 它将无法连接 它确实适用于只读权限 可能是什么问题呢 清单中的权限已设置为正确的值 编辑
  • Symfony - 自定义验证器和依赖注入

    我正在尝试对自定义验证器使用依赖项注入 以便能够使用实体管理器 我遵循 Symfony 示例 依赖注入 http symfony com doc current cookbook validation custom constraint h
  • 为什么要使用依赖注入?

    我试图理解依赖注入 http en wikipedia org wiki Dependency injection DI 我再一次失败了 这看起来很愚蠢 我的代码从来不会乱七八糟 我几乎不编写虚拟函数和接口 尽管我千载难逢 并且我的所有配置
  • 应用服务器如何注入私有字段?

    我看到这个问题 注入私有 包或公共字段或提供 setter https stackoverflow com questions 2021716 inject into private package or public field or p
  • ResourceDictionary 源中的 Uri 语法(通用 Windows 平台)

    我正在迁移我的Windows 8 1项目到Windows 10 通用 Windows 平台 这时我被拦住了ResourceDictionary改变在UWP 为了简单起见 我有包含 2 个项目的 Windows 8 1 解决方案 App pr
  • Spring 3.2 Autowire 泛型类型

    所以我在 Spring 3 2 中有很多泛型 理想情况下我的架构应该是这样的 class GenericDao
  • 如何以编程方式更改 Win 8.1 或 Win 10 UWP 应用程序的背景主题?

    我有一个适用于 Windows Phone 8 1 的应用程序及其 UWP 版本 我想在 Windows 中更改应用程序的背景时动态更改它 用例是 启动应用程序 背景主题为深色 按手机上的主页按钮 将背景主题更改为浅色 返回应用程序 基本上
  • 使用 asp.net mvc 4 的简单注入器,从另一个程序集加载控制器

    我正在开发一个 asp net mvc 4 站点 使用 Simple Injector 作为 Ioc 工具 这将是一个可插拔的架构 某些控制器和视图位于另一个程序集中 另一个 mvc4 应用程序 Plugin Web dll 从主应用程序中
  • @DependsOn 注释的逆

    Spring 可能还有其他 DI 容器 但我使用的是 Spring 识别 DependsOn 注释 您可以使用它来标识必须在该 bean 之前启动的任何其他 bean 例如 Component DependsOn initiatedFirs
  • 让 UnityContainer 变得非线程安全有哪些陷阱?

    我正在向我的库添加依赖项注入 并为此使用 Unity 我想知道是否需要采取一些额外的步骤来使 Unity 容器线程安全 我发现了几篇讨论线程安全容器的文章 例如 http www fascinatedwithsoftware com blo
  • Grails:在域类中动态注入服务

    我需要注入基于域属性的服务 到目前为止我想出了以下内容 ApplicationHolder application getServiceClass package property Service clazz 但以这种方式加载它不会注入它的
  • Hilt:java.lang.ClassNotFoundException:找不到类“com.kotlin20test.Hilt_MyApp”

    我有一个错误关于Hilt 我一直在尝试注入我使用创建的改造界面Hilt 这是错误 java lang ClassNotFoundException Didn t find class com kotlin20test Hilt MyApp
  • UWP/C#:ObservableCollection 就地排序(不滚动)

    在 UWP 应用程序中 我尝试对ObservableCollection绑定到一个ListView 所以collection OrderBy 创建一个新集合 不是一个选项 到目前为止 我使用了这种扩展方法 public static voi
  • .net 4.7 中的依赖注入?

    我对 DI 有哪些集成选项有点困惑 我发现它对于 net core 对于我的特定项目 来说非常简单 但我不需要构建跨平台应用程序 也看不到使用 core 的优势 但是 net 框架应用程序似乎仍然使用 Global asax 设置且没有 S
  • 只能通过bootstrap将服务注入到服务中吗?

    我正在尝试连接一个使用 Http 服务的基本 Angular2 应用程序 我见过的大多数教程都是通过Component消耗Http服务 这似乎是错误的 除非瘦控制器的基本理念已经改变 但这是一个不同的问题 我想创建一个使用 Angular
  • 静态方法中的统一

    一个可能很简单的问题 但很奇怪为什么我不知道该怎么做 Unity PRISM 和静态方法 在这种特殊情况下 需要使用扩展方法 但一般来说 如何在静态方法中访问 统一提供的实例 想想例如我想访问一个日志服务来记录我在静态方法中所做的一些事情

随机推荐

  • 通过 Java 使用 Selenium Webdriver 缺少 size() 选项

    一直在参加一些课程来提高我使用 Selenium Webdriver 的自动化技能 我没有size 方法作为尝试计算页面内链接数量时的一个选项 我缺少一些罐子吗 导入库 java public static void main String
  • SVG 坐标系 - 点与像素

    阅读通过SVG 1 1 规范 http www w3 org TR SVG11 coords html 我试图理解用于定义初始视口的单位与文档其余部分使用的单位之间的关系 如果视口最初是使用点定义的
  • 我的 $Foo ATL 解决方案中的 ($Foo)PS 项目有何用途?

    在MSVC中创建一个ATL项目似乎创建的不是一个而是两个项目 后者的名称与前者相同 但名称后附加了 PS 第二个项目的目的是什么 我如何判断我是否需要它 COM 支持跨两个不同的线程 两个不同的进程或两台不同的机器进行接口方法调用 这就是所
  • 当前单元格展开时折叠其他 UITableViewCell

    我正在努力扩展我的UITableViewCell我可以扩展细胞 但我想崩溃UITableViewCell哪些没有被选中 我在代码中尝试的内容 var expandedCells Int IBOutlet weak var tableView
  • 基于视图和单元格的 NSTableView

    Cocoa 中基于单元格的表格视图和基于视图的表格视图之间的主要区别是什么 我的理解是基于单元格的表格视图基本上用于显示字符串 基于视图用于自定义单元格 诸如拖动行 选择等用户事件可以在基于视图中处理 基于单元格的表格视图使用 object
  • 如何完全禁用LogCat暂停?

    我对新的 LogCat 及其暂停功能有一个大问题 当我想从中读取一些较旧的条目时 我喜欢暂停输出的想法 但有时我希望输出不间断 这样我就可以触摸手机 并通过读取输出来查看它的反应 所以令我非常沮丧的是 LogCat 经常完全暂停 暂停按钮被
  • 在 div 上使用“display:table-cell”有缺点吗?

    我想要实现的是拥有一个固定宽度的第一个 div 和一个流动的第二个 div 它将填充父 div 宽度的其余宽度 div class clearfix div style width 100px some content div div so
  • hsc2hs:使用 Haskell 改变 C 结构

    我正在尝试编写一个与 C 通信的 Haskell 程序 最终通过 GHC iOS 用于 iOS 我希望它将一个字符串从 C 传递到 Haskell 让 Haskell 处理它 然后通过 hsc2s 将一些数据类型从 Haskell 返回到
  • 如何在 Mahout 0.9 中实现 SlopeOne 推荐器?

    我是 Mahout 新手 正在尝试使用 0 5 版本的 Mahout in Action 早期的例子之一要求使用斜率一推荐器 Mahout 0 9 中还包含此推荐器吗 我查看了文档 但找不到它 也许它已经改名了 感谢您的帮助 Mahout
  • 当表没有行时,将表的可见性设置为 false(在报告服务中)

    如果表没有行 有没有办法将表的可见性设置为 false 我想在 Reporting Services 中隐藏没有行的表 将 NoRows 设置为 在这种情况下是不够的 因为仍然为表格留有空间 并且表格的某些格式仍然可见 我正在使用 Micr
  • 在 Python 中 - 解析响应 xml 并查找特定文本值

    我是 python 新手 在使用 xml 和 python 时遇到特别困难 我遇到的情况是这样的 我正在尝试计算一个单词在 xml 文档中出现的次数 很简单 但是 xml 文档是来自服务器的响应 是否可以在不写入文件的情况下执行此操作 尝试
  • Ansible,将字典合并为一次

    我有这个示例 yaml 文件 haproxy yml rules aa PHP53 url php53 1 aa my example com PHP55 url php55 1 aa my example com PHP56 url ph
  • 根据请求参数有条件地使用中间件express

    我正在尝试根据请求查询参数决定要使用的中间件 在主模块中我有这样的东西 app use function req res if req query something pass req res to middleware a else pa
  • 使用 __getattr__ 和 __setattr__ 功能实现类似字典的对象

    我正在尝试实施一个dict类似对象 可以访问 修改 getattr and setattr 为了方便我的用户使用 该类还实现了一些其他简单的功能 Using 这个答案 https stackoverflow com questions 33
  • 非灵活环境应用程序的自定义运行时?

    我不认为我的 gae python 应用程序具有灵活的环境 因为我多年前创建了它 现在我想尝试创建一个具有不同于 python 的运行时的模块 并使 python 应用程序与新的运行时 自定义运行时或其他运行时一起运行 也许混合 PHP 和
  • 将 IQueryable 类型转换为 Linq to Entities 中的接口

    我的泛型类中有以下方法 This is the class declaration public abstract class BaseService
  • Google Cloud 端点和 JWT

    我有一个基于 Google Cloud Endpoints 的 API 我想使用 JWT Json Web Tokens 进行授权 我可以为每个包含令牌的请求设置授权标头 并且它可以正常工作 我知道 Endpoints 使用此标头进行 Oa
  • MaterialComponents.TextInputLayout.OutlinedBox 它无法正常工作 boxBackgroundColor

    我用的是材料 我将使用 TextInputLayout 的颜色作为背景 但类似于下面的颜色 提示背景未更改 我使用了样式并想进行更改 但没有成功 在布局本身中 我尝试再次应用更改 如何解决这个问题 NOTE 的背景标签用户名图片中没有透明的
  • 访问故事板内的视图

    如何在代码中访问从对象浏览器拖到情节提要中的另一个视图中的视图 例如 我创建了一个 UIView 并将其分配给 ViewController 类 然后我将地图视图拖到该视图中 现在我需要开始在代码中操作该地图视图 我如何访问它 我尝试过 s
  • UWP 模板 10 和服务依赖注入 (MVVM),而非 WPF

    我花了两个多星期的时间搜索 google bing stackoverflow 和 msdn 文档 试图找出如何为我正在开发的移动应用程序进行正确的依赖项注入 需要明确的是 我每天都在网络应用程序中进行 DI 我不需要关于什么 谁以及为什么