我有一个简单的PHP MVC框架,它以这种方式工作:
StaticFramework (1)
|
V
DIC (2)
|
V
HTTPRequest
|
V
App <-> Router
|
V
Controller <-> Model
|
V
View
|
V
HTTPResponse
Run Code Online (Sandbox Code Playgroud)
(1) StaticFramework是一个静态的"前端控制器",它给出了App它的默认依赖性(2) DIC(依赖注入容器),它的工作方式与Pimple类似.可以访问容器以更改这些默认依赖项.例如,Router类被注入App了DIC.
我有一个问题,因为它是一个MVC应用程序,我有3个重要的层:
注入View很容易,因为它只是一个有一个render呈现PHP或HTML文件的方法的类,所以我只需要View在我的注入一个实例Controller.
但注入Model的Controller似乎更难.每个Model都是一个单独的类,所以我不能像我那样注入它View.每个人Model也可能需要其他依赖,例如a Database或XML类.
此外,我无法预测Controller将需要哪些型号,因为它可能需要其中的几种,例如,ArticleController需要ArticleModel和UsersModel. …
php model-view-controller dependencies dependency-injection inversion-of-control
我将我的网站从Symfony 3.4更新到Symfony 4,并做了一些更改。但是知道我有这个错误:
您请求的服务“ D”不存在。
这是我的堆栈跟踪:
Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException:
You have requested a non-existent service "D".
at vendor\symfony\dependency-injection\Container.php:263
at Symfony\Component\DependencyInjection\Container->get('D')
(vendor\symfony\routing\Loader\DependencyInjection\ServiceRouterLoader.php:38)
at Symfony\Component\Routing\Loader\DependencyInjection\ServiceRouterLoader->getServiceObject('D')
(vendor\symfony\routing\Loader\ObjectRouteLoader.php:55)
at Symfony\Component\Routing\Loader\ObjectRouteLoader->load('D:\\IIS Websites\\Wizard\\src/config/routing.yml', 'service')
(vendor\symfony\config\Loader\DelegatingLoader.php:40)
at Symfony\Component\Config\Loader\DelegatingLoader->load('D:\\IIS Websites\\Wizard\\src/config/routing.yml', 'service')
(vendor\symfony\framework-bundle\Routing\DelegatingLoader.php:70)
at Symfony\Bundle\FrameworkBundle\Routing\DelegatingLoader->load('D:\\IIS Websites\\Wizard\\src/config/routing.yml', 'service')
(vendor\symfony\framework-bundle\Routing\Router.php:56)
at Symfony\Bundle\FrameworkBundle\Routing\Router->getRouteCollection()
(vendor\symfony\routing\Router.php:367)
at Symfony\Component\Routing\Router->getMatcherDumperInstance()
(vendor\symfony\routing\Router.php:289)
at Symfony\Component\Routing\Router->Symfony\Component\Routing\{closure}(object(ResourceCheckerConfigCache))
at call_user_func(object(Closure), object(ResourceCheckerConfigCache))
(vendor\symfony\config\ResourceCheckerConfigCacheFactory.php:43)
at Symfony\Component\Config\ResourceCheckerConfigCacheFactory->cache('D:\\IIS Websites\\Wizard\\var\\cache\\dev/srcDevDebugProjectContainerUrlMatcher.php', object(Closure))
(vendor\symfony\routing\Router.php:302)
at Symfony\Component\Routing\Router->getMatcher()
(vendor\symfony\routing\Router.php:256)
at Symfony\Component\Routing\Router->matchRequest(object(Request))
(vendor\symfony\http-kernel\EventListener\RouterListener.php:109)
at Symfony\Component\HttpKernel\EventListener\RouterListener->onKernelRequest(object(GetResponseEvent), 'kernel.request', object(EventDispatcher))
(vendor\symfony\event-dispatcher\EventDispatcher.php:212)
at Symfony\Component\EventDispatcher\EventDispatcher->doDispatch(array(array(object(DebugHandlersListener), 'configure'), array(object(ValidateRequestListener), 'onKernelRequest'), array(object(SessionListener), 'onKernelRequest'), array(object(FragmentListener), 'onKernelRequest'), array(object(RouterListener), 'onKernelRequest'), array(object(ResolveControllerNameSubscriber), 'onKernelRequest'), array(object(LocaleListener), 'onKernelRequest'), …Run Code Online (Sandbox Code Playgroud) 有人可以对这个类进行junit测试吗?
public class MyApplication {
private EmailService email = new EmailService();
public boolean processMessages (String msg , String recipient ) {
if (msg.length ==0 | | recipient.length ==0 ) {
return false ;
}
return this.email.sendEmail (msg , recipient ) ;
}
}
Run Code Online (Sandbox Code Playgroud) 我想了解dagger2并在我的应用程序中实现.我已经阅读了很多关于它的好处.除非我完全理解,否则我无法在我的应用中获得它的好处.
我已经理解了@Module和@Inject.令我困惑的是@Component.我几乎没有相关的问题.
Module提供对象实例,Inject使用它.为什么我们之间需要组件?是否真的有必要缩小差距?我们可以使用没有任何方法的空接口组件吗?
构造函数对于模块类是否真的必要?如果模块类中没有构造函数,我们可以使用空构造函数初始化模块类吗?
为什么我们不能直接实例化模块类并构建依赖图而不是创建组件然后初始化它?
到目前为止,我在组件接口中只看到了两种方法
一个.void inject(活动/服务/片段); - 为什么我们需要为此方法提供活动或服务或片段的实例?为什么我们不能有这样的东西 -
void inject(); - 组件是否仍会生成依赖图?
我们可以从活动或服务以外的其他类注入或者像这样的片段 -
void inject(DataManager dataManager);
如果DataManager是单例实例怎么办?
湾 改造getRetrofit(); 这种方法和上面的方法有什么区别?为什么不采用任何输入参数?
我读到@Singleton只是匕首的范围.我们怎样才能真正创建一个在应用程序的生命周期内存在的单例对象?
假设我想使用dagger构建一个DataManager实例.它只有一个依赖.我为此编写了一个模块类和一个组件接口.如果我想在MainActivity中使用它,我会用它作为
@Inject DataManager dataManager;
...
@覆盖
protected void onCreate(Bundle savedInstanceState){
DataManagerComponent.Builder().DataManagerModule(new DataManagerModule()).build();
}
我想在许多其他活动中使用这个数据管理器,我不希望它是单例.我想将它保持在我使用它的当前活动范围.所以我会用
@Inject DataManager dataManager;
得到那个实例.我应该写
DataManagerComponent.Builder...........
Run Code Online (Sandbox Code Playgroud)
在每个活动oncreate()我使用@Inject DataManager dataManager?如果我必须写它,它不会创建更多的样板代码而不是简单地使用
DataManager dataManager = new DataManager();
假设有4个对象,它们相互依赖,如D依赖于C,C依赖于B等.
D - > C - > B - > A.
让我们假设我已经编写了模块类并为所有4提供了方法.如果我尝试在任何ActivityA中注入D
@Inject D d;
C,B,A会自动实例化吗?
让我们假设在ActivityB中我只需要注入B.如果我注入B就好了
@Inject B b;
匕首会再创造B和A吗?或者它会使用已经创建的那些?
如果有人花时间回答我的所有问题,我感激不尽.我不指望详细的答案.如果澄清这个概念就好了.期待着回应.提前致谢.
为什么AngularJS []在定义没有依赖关系的模块时需要空数组.Angular DevTeam可以检查第二个参数,如果undefined没有依赖关系.
angular.module("app", [])
Run Code Online (Sandbox Code Playgroud)
[]没有通过时会出现奇怪的错误.
我的问题是为什么他们需要空阵列?
我创建了自己的用户管理类来调用UserManager.我希望控制器能够访问UserManager对象以登录或注册用户.
我知道我必须在控制器类中提供一个参数化构造函数,它接受一个对象UserManager并将其赋值给私有属性等.
但是我在哪里以及如何在我的项目中注册我的类,以便它将由ASP.NET MVC Core框架自动注入?