- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在我的earlier question我问的是如何为使用 EF 等 ORM 框架构建的大型应用程序实现存储库/工作单元模式。
我现在无法解决的一个后续问题是将包含业务逻辑的代码放在哪里,但仍然足够低级别以在应用程序的许多其他部分中普遍使用。
例如这里有几个这样的方法:
所有这些方法都使用 UnitOfWork 进行数据访问或操作,并按照其规范接收多个参数。我认为每个人都可以为大型项目中的此类常见任务编写更多示例。我的问题是我应该把这些方法实现放在哪里?我目前可以看到以下选项。
public class RegionServices {
// support DI constructor injection
public RegionServices(IUnitOfWork work) {...}
...
public IEnumerable<City> GetCitiesForUser(User user, Region region = null) { ... }
...
}
public class DeviceServices {
// support DI constructor injection
public DeviceServices(IUnitOfWork work) {...}
...
public IEnumerable<Device> GetDevicesForUser(User user, DeviceType type, Region region = null) { ... }
...
}
我不喜欢的是,如果更高级别的应用程序服务需要调用 example 3 或这些方法,那么它需要实例化 3 个服务,如果我使用 DI 那么我什至必须把所有3 进入构造函数,很容易产生相当多的代码味道。
public class DataAccessHelper {
// support DI constructor injection
public DataAccessHelper(IUnitOfWork work) {...}
...
public IEnumerable<City> GetCitiesForUser(User user, Region region = null) { ... }
public IEnumerable<Device> GetDevicesForUser(User user, DeviceType type, Region region = null) { ... }
public IEnumerable<User> GetUsersInRoles(params string[] roleIds) { ... }
...
}
我不喜欢它,因为它感觉像是违反了 SRP,但是它的使用起来会舒服得多。
public static class DataAccessExtensions {
public static IEnumerable<City> GetCitiesForUser(this IRepository repo, User user, Region region = null) { ... }
}
在这里IRepository
是具有通用方法的接口(interface),如 Query<T>
, Save<T>
等。我也不喜欢它,因为我觉得我想将业务逻辑提供给存储库,这是不可取的 AFAIK。但是,它表达了这些方法是通用的并且比服务类更低级别,我喜欢这一点。
也许还有其他选择?...谢谢您的帮助。
最佳答案
如果您说某个领域逻辑需要查看 3 条不同的信息才能做出决定,那么我们将需要向它提供此信息。
此外,如果我们说这些不同的部分中的每一个都可以对该领域的其他部分有用,那么它们中的每一个都需要有自己的方法。我们可以讨论每个查询是否需要根据您的域/设计放在单独的类中。
我想说的是,将有一个应用程序服务委托(delegate)给一个或多个 Finder 类(您的查询所在的类),这些类仅包含查询,然后累积结果并将其传递给域服务作为方法参数。
域服务作用于接收到的参数执行逻辑并返回结果。这样域服务很容易测试。
伪代码
App Service
result1 = finder.query1()
result2 = finder.query2()
result3= yetanotherfinder.query();
domainresult = domainservice.calculate(result1,result2,result3);
关于c# - 在 Repository/UnitOrWork 之上使用服务类时,我应该将逻辑不适合 Repository 的常用数据访问代码放在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24913705/
本文主要给大家介绍Mysql数据库分库和分表方式(常用),涉及到mysql数据库相关知识,对mysql数据库分库分表相关知识感兴趣的朋友一起学习吧 1 分库 1.1 按照功能分库 按照功能进行
在当前对象由其他包含对象操作的系统中,当传递对当前对象的引用时,链接似乎一直在继续......没有任何结束(对于下面的代码,Car ->myCurrentComponent->myCar_Brake-
我有一个密码 UIAlertView,我们要求用户提供。我需要根据情况在不同的 View 上询问它,从 downloadViewController (用户下载数据后),当他们切换到他们的数据时(如果
我正在尝试编写一个函数,使得对于任何整数 x 的 P(x) 都有一个包含三个元素的列表,即平方、立方和 n 的四次方,但我仍然不知道如何组合然后制作一个函数,例如我有平方、立方体和 4 次幂函数下面是
关闭。这个问题需要更多 focused .它目前不接受答案。 关闭4年前。 锁定。这个问题及其答案是locked因为这个问题是题外话,但具有历史意义。它目前不接受新的答案或交互。 我能否列出一份常见的
Python 常用 PEP8 编码规范 代码布局 缩进 每级缩进用4个空格。 括号中使用垂直隐式缩进或使用悬挂缩进。 EXAMPLE: ?
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 去年关闭。 Improve this questio
在经典 ui 中,您可以使用 xtype:cqinclude 包含来自不同路径的 rtePlugins,基本上为标准 RTE 插件创建一个位置,我如何在 Touch UI 中执行相同操作? 我尝试使用
在经典 ui 中,您可以使用 xtype:cqinclude 包含来自不同路径的 rtePlugins,基本上为标准 RTE 插件创建一个位置,我如何在 Touch UI 中执行相同操作? 我尝试使用
*strong text*我有多个网络应用程序使用了一些常见的依赖项,比如蒙戈连接器谷歌 Guava 乔达时间 我想到将它们从 webapp/WEB-INF/lib 中取出并放入一些 common-l
我正在编写一个 Web 服务器,我想知道哪些 HTTP 请求 header (由客户端发送)是最常见的,因此我应该重点实现。 目前,我只支持Accept 和Host。 最佳答案 不确定您的范围,但由于
我是一名优秀的程序员,十分优秀!