对于ASP.NET MVC,我看到"IoC"和"DI"几乎无处不在.虽然我很清楚...'有点'这些是什么,它是那些几乎模棱两可的,无定形的浮动概念之一,似乎已经过了我,或者我只是没找对地方.随着即将发布的ASP.NET MVC 3.0,我看到了更多.这么多让我觉得这是编程的一部分,我根本就不知道.
我曾尝试寻找有关这些主题的书籍,但我发现的大部分内容似乎都做了很多假设(Ruby中的历史,了解它是什么但不是如何使用它等).
我只是提前问清楚.什么是 IoC,为什么我关心它?从初学者程序员的角度来看,是否有任何体面的网站覆盖这一点?假设我一无所知.假设我只知道C#.我阅读了关于C#从.NET 1.1到.NET 2.0的所有书籍,博客和教程,当.NET 3.5和LINQ命中时,它变得如此之多,以至于我无法跟上.我是一名从事ASP.NET MVC/C#的新手开发人员,我不禁感到我错过了一些非常重要的东西.(我对DI(依赖注入)有很多相同的感受)
我用谷歌搜索过,我读过博客,我看过Castle.Windsor
,我见过示例代码,我浏览过书籍和网络广播,而且我仍然在黑暗中.感觉就像你知道自己应该知道的工作内部故事之一,但出于某种原因,你没有,而学校并没有真正为我做好准备.
StackOverflow对我来说一直是开发社区中最好的.通过大学和介绍性工作,以及低级自由职业者工作,我将我的编程教育与其他程序员合并(尽管据我所知,这并不是必然会让人感到羞耻).再一次,我只是向社区说明.
咦?我不明白.
与许多试图闯入同一领域的同事交谈时,他们中的许多人都有同感.所以我不禁感到有些不同,我们的"新手"程序员错过了这些编码概念方法的备忘录.我不仅要回答这个问题,而且我认为对于像我这样试图理解它的其他人来说,一个好的主题可能是一个聪明的想法(如果存在,则需要更加明显)
我发现的一些有用的东西是http://www.theserverside.com/news/1321158/A-beginners-guide-to-Dependency-Injection和http://www.dotnetspark.com/kb/ 1222反转控制-初学者guide.aspx
但是我仍然在一些关于为什么这很重要的问题上摸不着头脑.说实话,我觉得很大一部分开发者社区对IoC和单元测试都有这种感觉.很少列出它是什么,发现的例子通常很差,或者很难理解.引入.NET时,它是独立的.我不需要一堆其他概念来运行简单的程序.现在,.NET是一种受人尊敬的语言,阳光下的一切都在采用它(nHibernate,MVC,MVP,MVVP,云计算平台,游戏架构等)
(请随意指出我是否只是公然错误.我不是以任何方式称自己'好'.但我知道C#,我非常清楚.我认为自己是一个非常快速的学习者并且很难因为我有这个,我只需要假设那里有一些需要填补的"漏洞"
我即将开枪自杀.花了几周时间试图解决这个问题.我们有一个ASP.NET MVC 4 Web应用程序,它使用SQL Server 2012和Entity Framework作为ORM和Unity for IoC.Web应用程序托管在Amazon EC2上.我开始得到"物理连接不可用"的例外.它每天发生几次.我搜索了很多文章和论坛,并尝试了所有可能的建议:
当异常发生时,恢复应用程序的唯一方法是重启服务器,这是非常糟糕的!
这是完全例外:
将请求发送到服务器时发生传输级错误.(提供者:会话提供者,错误:19 - 物理连接不可用)
sql-server asp.net-mvc entity-framework ioc-container unity-container
我有一个BaseController
为我的API服务器提供大多数HTTP方法的基础,例如store
方法:
BaseController.php
/**
* Store a newly created resource in storage.
*
* @return Response
*/
public function store(Request $request)
{
$result = $this->repo->create($request);
return response()->json($result, 200);
}
Run Code Online (Sandbox Code Playgroud)
然后我BaseController
在一个更具体的控制器中扩展它,例如UserController
,像这样:
UserController.php
class UserController extends BaseController {
public function __construct(UserRepository $repo)
{
$this->repo = $repo;
}
}
Run Code Online (Sandbox Code Playgroud)
这非常有效.但是,我现在想要扩展UserController
以注入Laravel 5的新FormRequest
类,它负责User
资源的验证和身份验证之类的事情.我想这样做,通过覆盖store方法并使用Laravel的类型提示依赖注入为其Form Request类.
UserController.php
public function store(UserFormRequest $request)
{
return parent::store($request);
}
Run Code Online (Sandbox Code Playgroud)
从哪里UserFormRequest
延伸Request
,其本身延伸自FormRequest
:
UserFormRequest.php
class …
Run Code Online (Sandbox Code Playgroud) 我终于忍受了Dependency Injection(早就应该); 我开始玩Unity并遇到战略模式的问题.我可以使用容器向我返回基于名称的策略的特定实现,但我没有看到我应该如何在上下文中获得正确的策略.
让我们举一个简单的例子说明:上下文是一辆汽车,它有一个IEngine(策略),有2个实现,FastEngine和SlowEngine.代码将沿着这些方向看:
public interface IEngine
{
double MaxSpeed
{
get;
}
}
internal class FastEngine:IEngine
{
public double MaxSpeed
{
get
{
return 100d;
}
}
}
internal class SlowEngine:IEngine
{
public double MaxSpeed
{
get
{
return 10d;
}
}
}
public class Car
{
private IEngine engine;
public double MaximumSpeed
{
get
{
return this.engine.MaxSpeed;
}
}
public Car(IEngine engine)
{
this.engine = engine;
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题如下:我应该如何实例化快车或慢车?我可以使用容器为我提供每个实现,我可以设置一个"默认"实现来使用:
IUnityContainer container = new UnityContainer();
container.RegisterType<IEngine, FastEngine>();
container.RegisterType<IEngine, FastEngine>("Fast"); …
Run Code Online (Sandbox Code Playgroud) c# dependency-injection ioc-container unity-container strategy-pattern
我正在使用Unity IoC容器.这真的不是我做出的决定,它只是与Prism一起来的,我只是坚持下去.我从未使用任何其他IoC框架,我必须承认我对Unity非常满意.然而,满意度可能来自无知,因为我不知道其他框架提供了什么.
我一直听说我不应该使用Unity IoC容器.人们说,"使用Castle,nInject或StructureMap",但我仍然没有听到任何具体的论据或例子,为什么我应该使用不同的框架.那么,为什么我不应该使用Unity?或许我应该?
我有一个spring bean(dao)对象,我通过以下xml在我的ServletContext中实例化:
<bean id="userDao" class="com.company.dao.impl.UserDaoImpl">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
Run Code Online (Sandbox Code Playgroud)
这个bean在我的webapp-servlet.xml文件中声明,并由我的应用程序在ServletContext中使用.
我也在使用SpringSecurity.我的理解是,它在不同的上下文中运行(SecurityContext).
我的应用程序有一个webapp-security.xml,我在其中实例化一个自定义身份验证提供程序.我想使用我的应用程序中使用的我的dao也在我的安全上下文中进行用户查找,但是当我运行时:
<bean id="userAuthenticationProvider" class="com.company.security.UserAuthenticationProvider">
<property name="userDao" ref="userDao" />
</bean>
Run Code Online (Sandbox Code Playgroud)
我得到错误,说没有这样的bean"userDao".bean在我的其他上下文中声明的bean中自动装配好,但不在我的安全上下文中.根据Spring Docs,我相信web.xml中需要两个单独的上下文
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<listener>
<listener-class>
org.springframework.security.web.session.HttpSessionEventPublisher
</listener-class>
</listener>
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,如何才能访问我的SecurityContext中存在于我的ServletContext中的DAO?我的dao是否有范围修饰符,或者我可以在运行时在我的身份验证提供程序中以某种方式获取ServletContext?作为参考,这是我想在我的身份验证提供程序中使用它的方式:
public class UserAuthenticationProvider extends
AbstractUserDetailsAuthenticationProvider {
@Override
protected UserDetails retrieveUser(String userName,
UsernamePasswordAuthenticationToken authenticationToken)
throws AuthenticationException {
// use dao here
Run Code Online (Sandbox Code Playgroud)
谢谢你向我解释这个
更新:
继续我的调查,似乎我使用我的daos的DispatcherServlet是一个子上下文,安全上下文在某个更高的位置.因此,父上下文无法看到我的DispatcherServlet中的bean.我认为答案是以某种方式将我的bean声明移动到父应用程序上下文中,但我不知道如何做到这一点.这是我的web.xml
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/spring-*.xml
</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.security.web.session.HttpSessionEventPublisher
</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy
</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet> …
Run Code Online (Sandbox Code Playgroud) 我们在所有项目中使用ninject,正如您所知,有时候很难测试内核是否能够在执行时解析每个类型,因为有时控件会在绑定和自动绑定的大小时丢失(通过ninject扩展) ) 高.
所以,我在这里问的是,我怎么知道我的内核在加载所有模块和绑定后,能够解析每种类型?你做过任何单元测试吗?或者您只是在执行时对应用程序进行接受测试?任何建议都会很棒:)
我们如何在Web应用程序中注册关闭挂钩?
有没有什么可以在web.xml或applicationContext.xml中注册它?
我知道如果我们使用主类的应用程序,那很简单.
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml");
context.registerShutdownHook();
Run Code Online (Sandbox Code Playgroud)
但是Web应用程序怎么样?因为它使用ContextListener
我正在使用Ninject从内核中检索我的DataContext,我想知道Ninject是否自动处理DataContext,或者他如何处理dispose()行为.根据自己的经验,我知道处理datacontext非常重要,每当你创建DataContext的直接对象时(如:new DataContext()),你应该使用using()块.
我的问题是:当我从内核中检索我的DataContext时,我是否仍然必须使用using()块?或者Ninject是否为我解决了这个问题?
我是在一个新的开始Prism.Forms
的项目,我想知道其中的各种的IoC
容器(Autofac
,Dryloc
,Ninject
或Unity
)将是最好的与前进.
我不知道这是否属实,但我在某处读到Unity已不再处于积极开发状态,因为这MEF
是我用过的唯一IoC
容器,我不确定它是否可行.
与此同时,我知道很少或根本不知道Autofac
,Dryloc
或者Ninject
.
请客观地提出任何建议,说明为什么你觉得一个人比其他人好,而不仅仅是"我用xxx "; 我想做出明智的决定.
ioc-container ×10
c# ×4
ninject ×2
spring ×2
.net ×1
asp.net-mvc ×1
datacontext ×1
dispose ×1
java ×1
laravel ×1
laravel-5 ×1
php ×1
prism-6 ×1
security ×1
servlets ×1
sql-server ×1
tomcat ×1
web ×1