Prism / Unity 和 AzureMobileServices - 如何实现 DPI / IoC?
Prism / Unity and AzureMobileServices - how to achieve DPI / IoC?
由于我对所有 DPI/C# 和类似的东西还是有点新手,我目前正在努力寻找实现我目标的最佳方法。
Prism/Unity 和 Azure 移动服务正在运行,没有问题。
我的问题来自于对如何正确结合这两种机制感到困惑。
基本上,我有一个模型,例如Group
里面又有几个 GroupMember
。使用类似外键和一些 LINQ 魔法,我可以像这样获得组及其成员:
Group group = (await groupsTable.Where(g => g.Id == Id).ToListAsync()).First();
List<GroupMember> groupMembers = await groupMembersTable.Where(gm => gm.group_id == group.Id).ToListAsync();
特此从底层 SQLite-Table(我正在使用离线同步)实例化的 Group 和 GroupMembers 以及来自 table 查询的数据。
我从我在 IUnityContainer 中注册的 MobileService 实例获得的 tables(因此我可以将移动服务与模拟服务交换以进行单元测试)。
但是,如果我想在模型中注册 IUnityContainer(例如,执行 GetSiblings() 或 GetChildren() 之类的操作)怎么办?
基本上,我需要访问模型内部的 IUnityContainer,但由于它们的实例化方式,DependencyInjection 被绕过,类似:
[Dependency]
public IUnityContainer _container { get; set; }
保持 null
。我还读到制作容器 static
被认为是不好的,所以...
...我也不认为是这样的:
foreach(var member in groupMembers) {
member._container = container;
}
是必经之路。有什么提示吗?
您通常不希望引用依赖容器 (Unity) 或数据所在的位置(SQLite 或 MobileService)。您的模型不应超过属性,也许还有一些业务或验证逻辑。
您要找的是例如Repository 模式(注意有多个 ways/patterns 来解决这个问题)。简而言之:您的视图模型将向存储库(将注入 MobileService)询问 'group with members',存储库将负责获取组、获取项目并在其父组中添加正确的项目.只有存储库知道从何处获取项目(SQLite、MobileService 等)以及如何获取这些项目。
下一步通常是在存储库中放置一个接口并将其注入到您的视图模型中。现在,所有依赖项都将由 Unity 解决,您将拥有可测试的单元。您也可以在 Prism samples 中看到此结构。
由于我对所有 DPI/C# 和类似的东西还是有点新手,我目前正在努力寻找实现我目标的最佳方法。
Prism/Unity 和 Azure 移动服务正在运行,没有问题。 我的问题来自于对如何正确结合这两种机制感到困惑。
基本上,我有一个模型,例如Group
里面又有几个 GroupMember
。使用类似外键和一些 LINQ 魔法,我可以像这样获得组及其成员:
Group group = (await groupsTable.Where(g => g.Id == Id).ToListAsync()).First();
List<GroupMember> groupMembers = await groupMembersTable.Where(gm => gm.group_id == group.Id).ToListAsync();
特此从底层 SQLite-Table(我正在使用离线同步)实例化的 Group 和 GroupMembers 以及来自 table 查询的数据。
我从我在 IUnityContainer 中注册的 MobileService 实例获得的 tables(因此我可以将移动服务与模拟服务交换以进行单元测试)。
但是,如果我想在模型中注册 IUnityContainer(例如,执行 GetSiblings() 或 GetChildren() 之类的操作)怎么办? 基本上,我需要访问模型内部的 IUnityContainer,但由于它们的实例化方式,DependencyInjection 被绕过,类似:
[Dependency]
public IUnityContainer _container { get; set; }
保持 null
。我还读到制作容器 static
被认为是不好的,所以...
...我也不认为是这样的:
foreach(var member in groupMembers) {
member._container = container;
}
是必经之路。有什么提示吗?
您通常不希望引用依赖容器 (Unity) 或数据所在的位置(SQLite 或 MobileService)。您的模型不应超过属性,也许还有一些业务或验证逻辑。
您要找的是例如Repository 模式(注意有多个 ways/patterns 来解决这个问题)。简而言之:您的视图模型将向存储库(将注入 MobileService)询问 'group with members',存储库将负责获取组、获取项目并在其父组中添加正确的项目.只有存储库知道从何处获取项目(SQLite、MobileService 等)以及如何获取这些项目。
下一步通常是在存储库中放置一个接口并将其注入到您的视图模型中。现在,所有依赖项都将由 Unity 解决,您将拥有可测试的单元。您也可以在 Prism samples 中看到此结构。