我遇到了我认为是PHP应用程序的循环依赖问题.如果这不正确,请告诉我.情况如下:
两个类,LogManager和DBSession.
DBSession用于与数据库交互,LogManager用于记录文件.两者都广泛用于我的应用程序中.创建DBSession实例时,必须通过构造函数参数为其提供LogManager实例.这是因为DBSession有时会将信息记录到文件中,并将使用LogManager实例执行此操作.
现在,我想扩展LogManager,以便它也可以登录到数据库表,而不是文本文件.当然,我倾向于重复使用现有的课程,但我很快意识到这带来了一个有趣的情况.
DBSession已经需要一个LogManager实例来构造.如果我想在LogManager中重用DBSession类,它现在需要一个DBSession实例.我怎样才能满足这两个要求?显然,我的方法必定是错误的.
你怎么建议我解决这个问题?
先谢谢你,伙计们.
可能重复:
Microsoft如何创建具有循环引用的程序集?
当我发现奇怪的东西时,我正在整理一个小的PowerShell cmdlet,它会给我一个.NET程序集的依赖树:
.NET 2.0 CLR似乎具有循环依赖性:System取决于System.Configuration并System.Configuration依赖于System.这使得提供完整的依赖树变得非常困难.
我在这里吗?是否有一些我不知道的诡计?为什么会出现这种明显违反简单和几乎普遍接受的依赖最佳实践的方式(当然,这些方法如何引入)?
我正在尝试使用存储库中的方法实现自定义行为spring-data-jpa.
该ProductRepository接口是
@Repository
public interface ProductRepository extends JpaRepository,
ProductRepositoryCustom {
public List findByProductName(String productName);
}
Run Code Online (Sandbox Code Playgroud)
该ProductRepositoryCustom接口包含saveCustom我想要实现自定义行为的接口.
@Repository
public interface ProductRepositoryCustom {
public Product saveCustom(Product product);
}
Run Code Online (Sandbox Code Playgroud)
这是ProductRepositoryCustom接口的实现.saveCustom这里的方法只是一个例子.我真正想要做的是定义一个自定义方法,使其包含一系列涉及核心JpaRepository方法的指令.为此,我尝试注入ProductRepository实例,但我得到错误,如下所示.
public class ProductRepositoryCustomImpl implements ProductRepositoryCustom {
@Inject
private ProductRepository repo;
@Override
public Product saveCustom(Product product) {
// other executions of methods in ProductRepository(repo)
return repo.save(product);
}
}
Run Code Online (Sandbox Code Playgroud)
这是ServerApp我运行的简单应用程序.
public class ServerApp {
public static void …Run Code Online (Sandbox Code Playgroud) spring dependency-injection circular-dependency spring-data-jpa
我正在使用Rails 4.0.2.我在Concern目录中添加了子目录(带有模型名称):
公司目录中的cache_concern.rb具有以下内容:
module Company::CacheConcern
included do
...
end
end
Run Code Online (Sandbox Code Playgroud)
在我的模特课上,我有:
class Company
include Company::CacheConcern
...
end
Run Code Online (Sandbox Code Playgroud)
一切都很好,直到我去生产.然后我得到以下例外:
`load_missing_constant':自动加载常量时检测到循环依赖关系Company :: CacheConcern(RuntimeError)
为了解决我的问题,我将关注文件中的命名空间从Company :: CacheConcern更改为Concerns :: Company :: CacheConcern.这允许我在生产环境中加载应用程序.
但是现在我在使用公司类的关注文件中的开发环境有问题:
NoMethodError(Concerns :: Company:Module的未定义方法`current_company'):
所以看起来他正在关注目录中搜索.在生产中一切都很好.要解决这个问题,我可以在类名之前添加两个冒号的关注文件,以使用models目录中的类.
我知道生产模式的行为与开发行为不同,因为将整个应用程序缓存在内存中.我检查了所有类似的帖子.我是否需要在模型目录中使用关注文件中的两个冒号前面的类名?如果有人能解释我这种奇怪的情况,我将非常感激.
谢谢
namespaces circular-dependency production-environment ruby-on-rails-4 activesupport-concern
假设有两个.net项目不在同一解决方案下.ProjectA在solution1下,ProjectB在solution2下.ProjectA引用了ProjectB,ProjectB引用了ProjectA.ProjectA_Class和ProjectB_Class有两个类.ProjectA_Class创建ProjectB_Class的对象,ProjectB_Class创建ProjectA_Class的对象.
namespace ProjectB
{
public class ProjectB_Class
{
public ProjectB_Class()
{
ProjectA_Class projA = new ProjectA_Class();
}
}
}
namespace ProjectA
{
public class ProjectA_Class
{
public ProjectA_Class()
{
ProjectB_Class projB = new ProjectB_Class();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我对循环依赖感到困惑.是不是它在两个类之间创建了循环依赖,尽管它们不在同一个解决方案中?我们知道如果这两个项目都在同一个解决方案中,Visual Studio将不允许我们在ProjectB中引用ProjectA,在ProjectA中引用ProjectB,因为它创建了循环依赖.它是不是在两个项目之间创建循环依赖,尽管它们不在同一个解决方案中?假设,ProjectA中有一个C类,它创建了ProjectB_Class的对象,而ProjectB_Class不使用任何C类实例.它不是循环依赖项,因为ProjectA和ProjectB都有相互引用吗?
更新1 您能解释循环依赖的条件吗?
.net c# circular-dependency design-principles circular-reference
我有一个大项目,我现在尝试重构ES6模块.
为了进一步简化开发,我想引入索引文件,它只导出目录中的所有模块:
index.js:
export { default as ModuleA } from './moduleA'
export { default as ModuleB } from './moduleB'
export { default as ModuleC } from './moduleC'
Run Code Online (Sandbox Code Playgroud)
moduleA.js:
import { ModuleB } from './index'
Run Code Online (Sandbox Code Playgroud)
moduleB.js:
import { ModuleC } from './index'
ModuleC.doSomething()
Run Code Online (Sandbox Code Playgroud)
moduleC.js:
export default {
doSomething: () => {}
}
Run Code Online (Sandbox Code Playgroud)
起点是ModuleA.
问题是,in ModuleB ModuleC未定义,因此doSomething无法执行.
我怀疑循环依赖的一些问题,因为moduleB尝试再次访问索引,moduleB之前解析moduleC.
是不是可以这样做,还是有另一种解决方案?
我正在关注 John Sundell 的帖子以实现导航器模式(https://www.swiftbysundell.com/posts/navigation-in-swift)。基本思想是,与 Coordinator 模式相比,每个视图控制器可以简单地调用,navigator.navigate(to: .someScreen)而不必知道其他视图控制器。
我的问题是,因为为了构造一个视图控制器我需要一个导航器,为了构造一个导航器我需要一个导航控制器,但我想让视图控制器成为导航控制器的根,解决这个问题的最佳方法是什么以一种尊重依赖注入最佳实践的方式循环依赖?
下面是 Sundell 说明的导航器模式的想法
protocol Navigator {
associatedtype Destination
func navigate(to destination: Destination)
}
class LoginNavigator: Navigator {
enum Destination {
case loginCompleted(user: User)
case signup
}
private weak var navigationController: UINavigationController?
private let viewControllerFactory: LoginViewControllerFactory
init(navigationController: UINavigationController,
viewControllerFactory: LoginViewControllerFactory) {
self.navigationController = navigationController
self.viewControllerFactory = viewControllerFactory
}
func navigate(to destination: Destination) {
let viewController = makeViewController(for: destination)
navigationController?.pushViewController(viewController, animated: true)
}
private func makeViewController(for destination: Destination) -> …Run Code Online (Sandbox Code Playgroud) 路线段已移至常量。下面的代码是简化的,但在项目中大约有 5 个惰性模块,每个模块有大约 20 个路由和段,通常在服务和组件中router.navigate用作对象中的字符串键(某些组件的图像:)assets/images/${urlSegment}.jpg。为此,段已移至常量。
路由.module.ts
export const PATIENT_URL_SEGMENTS = {
TOOLS: 'tools',
INDEX: 'index',
};
const routes = [
{ path: PATIENT_URL_SEGMENTS.TOOLS, component: ToolsComponent }
{ path: `${PATIENT_URL_SEGMENTS.TOOLS}/:${PATIENT_URL_SEGMENTS.INDEX}`, component: ToolDetailsComponent }]
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule],
providers: []
})
export class PatientRoutingModule { }
Run Code Online (Sandbox Code Playgroud)
RoutingModule用于延迟加载模块。如果我URL_SEGMENTS从单独的文件导入,在浏览器控制台中我会看到 error Can not read split of undefined。但是,如果如上面的示例中那样在适当的位置声明了常量,则一切正常。
每个导入的组件都会发出一个警告PATIENT_URL_SEGMENTS,因为同时这些组件已导入到路由模块中。事实上没有错误,但我想删除组件 import 时的警告PATIENT_URL_SEGMENTS。
你知道如何实现这一目标吗?也许可以将常量声明移动到单独的文件?
在我的 angular 项目中启用 ivy 后,一切都会编译,但是在浏览器中启动应用程序时,我在应用程序引导期间收到以下错误:
Error: Cannot instantiate cyclic dependency! ApplicationRef
at throwCyclicDependencyError (core.js:5208)
at R3Injector.push../node_modules/@angular/core/__ivy_ngcc__/fesm5/core.js.R3Injector.hydrate (core.js:11763)
at R3Injector.push../node_modules/@angular/core/__ivy_ngcc__/fesm5/core.js.R3Injector.get (core.js:11590)
at injectInjectorOnly (core.js:648)
at ??inject (core.js:653)
at injectArgs (core.js:730)
at Object.factory (core.js:11858)
at R3Injector.push../node_modules/@angular/core/__ivy_ngcc__/fesm5/core.js.R3Injector.hydrate (core.js:11767)
at R3Injector.push../node_modules/@angular/core/__ivy_ngcc__/fesm5/core.js.R3Injector.get (core.js:11590)
at injectInjectorOnly (core.js:648)
Run Code Online (Sandbox Code Playgroud)
我正在努力找出循环依赖的位置以及为什么在不使用常春藤时它可以正常工作。我尝试使用 madge (madge --circular --extensions ts ./) 但没有找到循环依赖。
编辑:我已经手动浏览了所有服务并验证它们之间没有循环依赖
我遇到了一个给我这个错误的问题:
序列化类“App\Entity\User”的对象时检测到循环引用(配置限制:1)
我有一个企业实体,其中包含任务订单、车辆和用户。
与用户、公司和车辆有关系的订单实体。
和一个与订单和公司有关系的用户实体。
所以我有这个: Entreprise.php
class Entreprise
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\OneToMany(targetEntity="App\Entity\User", mappedBy="entreprise", orphanRemoval=true)
*/
private $users;
/**
* @ORM\OneToMany(targetEntity="App\Entity\Vehicule", mappedBy="entreprise", orphanRemoval=true)
*/
private $vehicules;
/**
* @ORM\OneToMany(targetEntity="App\Entity\OrdreMission", mappedBy="entreprise", orphanRemoval=true)
*/
private $ordreMissions;
Run Code Online (Sandbox Code Playgroud)
OrdreMission.php:
class OrdreMission
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* Agent qui réalisera la mission
* @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="ordreMissions")
* @ORM\JoinColumn(nullable=false)
*/
private $user;
/**
* Immatriculation de la voiture de …Run Code Online (Sandbox Code Playgroud) .net ×2
angular ×2
angular-ivy ×1
c# ×1
clr ×1
dependencies ×1
depth ×1
es6-modules ×1
factory ×1
import ×1
javascript ×1
namespaces ×1
oop ×1
php ×1
reference ×1
spring ×1
swift ×1
symfony ×1
typescript ×1
webpack ×1