我在一个新的Web应用程序上使用NInject,有两件事我不清楚:
我是否需要保持对内核(Session/App变量)的引用以确保GC不收集我的所有实例?例如,如果我指定.Using()然后收集Kernel对象,那么我的所有"单身人士"都不是被收集的吗?
如果我确实需要保持对Kernel对象的引用,我如何允许传入WithArguments()的参数改变或者这是不可能的.
c# dependency-injection ninject ioc-container inversion-of-control
我的应用程序中将包含以下组件
我希望使用Castle Windsor作为IoC来粘合各层,但我对胶合的设计有点不确定.
我的问题是谁应该负责将物品注册到温莎?我有几个想法;
有人可以用不同的途径帮助我提出一些想法和利弊吗?以这种方式利用Castle Windsor的示例项目的链接将非常有用.
我有一个常见的场景,我正在寻找一些有DDD和域建模经验的人的指导.
假设我开始构建一个博客引擎,第一个要求是在发布文章后,用户可以开始在其上发布评论.这开始很好,并导致以下设计:
public class Article
{
public int Id { get; set; }
public void AddComment(Comment comment)
{
// Add Comment
}
}
Run Code Online (Sandbox Code Playgroud)
我的MVC控制器设计如下:
public class ArticleController
{
private readonly IRepository _repository;
public ArticleController(IRepository repository)
{
_repository = repository;
}
public void AddComment(int articleId, Comment comment)
{
var article = _repository.Get<Article>(articleId);
article.AddComment(comment);
_repository.Save(article);
return RedirectToAction("Index");
}
}
Run Code Online (Sandbox Code Playgroud)
现在一切正常,它符合要求.下一次迭代我们得到一个要求,即每次发布评论时,博客作者都应该收到一封电子邮件通知他.
在这一点上,我有两个我能想到的选择.1)修改文章以要求IEmailService(在ctor?中)或从静态引用到我的DI容器获取EmailService
1a)看起来很难看.我相信它破坏了我的实体知道服务的一些域模型规则?
public class Article
{
private readonly IEmailService _emailService;
public Article(IEmailService emailService)
{
_emailService = emailService;
}
public void AddComment(Comment comment) …Run Code Online (Sandbox Code Playgroud) 我一直在搜索依赖注入并阅读一些文章.但我仍然无法找出MEF和其他IoC之间的区别.所以,我的问题是:在哪种情况下,我更喜欢使用MEF还是IoC容器?
为什么在PRRE(WPF和Silverlight)或桌面应用程序中使用MEF是好的?
而在Web应用程序中,人们使用IoC容器.
那么,决定使用哪种依赖技术的标准是什么?
我浏览过文章http://devlicio.us/blogs/casey/archive/2009/12/18/what-is-the-difference-between-an-ioc-container-and-mef.aspx ,但我无法确定任何事情.
structuremap dependency-injection mef ioc-container inversion-of-control
我听到很多人说使用IoC.Resolve()是一种不好的做法,但我从来没有听说过一个很好的理由(如果它只是测试而不是你可以嘲笑容器,那么你已经完成了).
现在使用Resolve而不是Constructor Injection的优点是你不需要在构造函数中创建具有5个参数的类,并且无论何时你要创建该类的实例,你都不需要提供它.什么
我是DI和IoC的新手,我正在尝试决定学习哪个IoC容器.我已经看到了几个性能比较,其中引用的三个容器似乎表现得非常好.但是,我没有找到包含Hiro或Simple Injector的功能比较.Autofac的社区似乎是最大的,但Hiro和Simple Injector在基准测试中非常快,而Simple Injector尤其声称非常容易学习.也就是说,我不想学习一个并且必须切换到另一个因为功能集有限.出于这个原因,我倾向于Autofac,因为它相当成熟,功能齐全(这里和这里的好文章),也是最快的IoC容器之一.有没有人对这三个容器中至少有两个有过经验?你能提供任何功能比较吗?
.net dependency-injection inversion-of-control autofac simple-injector
我最近讨论了依赖性倒置原则,控制反转和依赖注入.关于这个主题,我们一直在争论这些原则是否违反了OOP的一个支柱,即封装.
我对这些事情的理解是:
辩论与以下声明达成了共识:
IoC不是OOP,因为它打破了封装
就个人而言,我认为所有OOP开发人员应该虔诚地遵守依赖倒置原则和控制反转模式 - 我遵循以下引用:
如果有(可能)不止一种方法给猫皮肤,那么就不要 表现得像只有一只猫.
例1:
class Program {
void Main() {
SkinCatWithKnife skinner = new SkinCatWithKnife ();
skinner.SkinTheCat();
}
}
Run Code Online (Sandbox Code Playgroud)
在这里,我们看到封装的一个例子.程序员只需要打电话Main(),猫就会被剥皮,但是如果他想给猫咪涂上一层锋利的牙齿呢?
例2:
class Program {
// Encapsulation
ICatSkinner skinner;
public Program(ICatSkinner skinner) {
// Inversion of control
this.skinner = skinner;
}
void Main() {
this.skinner.SkinTheCat();
}
}
... new Program(new SkinCatWithTeeth());
// Dependency Injection
Run Code Online (Sandbox Code Playgroud)
在这里,我们观察依赖性反转原理和控制反转,因为提供了abstract( …
oop encapsulation design-patterns inversion-of-control solid-principles
考虑以下接口和类定义:
public interface IInterface1 { }
public interface IInterface2 { }
public class MyClass : IInterface1, IInterface2 { }
Run Code Online (Sandbox Code Playgroud)
有没有办法注册MyClass多个接口的一个实例,如下所示:
...
services.AddSingleton<IInterface1, IInterface2, MyClass>();
...
Run Code Online (Sandbox Code Playgroud)
并MyClass使用不同的接口解决此单个实例,如下所示:
IInterface1 interface1 = app.ApplicationServices.GetService<IInterface1>();
IInterface2 interface2 = app.ApplicationServices.GetService<IInterface2>();
Run Code Online (Sandbox Code Playgroud)