标签: inversion-of-control

NInject:你在哪里保留对内核的引用?

我在一个新的Web应用程序上使用NInject,有两件事我不清楚:

  1. 我是否需要保持对内核(Session/App变量)的引用以确保GC不收集我的所有实例?例如,如果我指定.Using()然后收集Kernel对象,那么我的所有"单身人士"都不是被收集的吗?

  2. 如果我确实需要保持对Kernel对象的引用,我如何允许传入WithArguments()的参数改变或者这是不可能的.

c# dependency-injection ninject ioc-container inversion-of-control

48
推荐指数
2
解决办法
1万
查看次数

设计 - 使用Windsor时应在何处注册对象

我的应用程序中将包含以下组件

  • 数据访问
  • DataAccess.Test
  • 商业
  • Business.Test
  • 应用

我希望使用Castle Windsor作为IoC来粘合各层,但我对胶合的设计有点不确定.

我的问题是谁应该负责将物品注册到温莎?我有几个想法;

  1. 每个层都可以注册自己的对象.为了测试BL,测试平台可以为DAL注册模拟类.
  2. 每个层都可以注册其依赖项的对象,例如业务层注册数据访问层的组件.要测试BL,测试平台必须卸载"真正的"DAL对象并注册模拟对象.
  3. 应用程序(或测试应用程序)注册依赖项的所有对象.

有人可以用不同的途径帮助我提出一些想法和利弊吗?以这种方式利用Castle Windsor的示例项目的链接将非常有用.

c# castle-windsor inversion-of-control

48
推荐指数
2
解决办法
1万
查看次数

如何避免贫血领域模型,或何时将方法从实体转移到服务中

我有一个常见的场景,我正在寻找一些有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)

c# bdd domain-driven-design inversion-of-control

45
推荐指数
1
解决办法
2681
查看次数

MEF和IoC容器之间的区别(如Unity,Autofac,SMap,Ninject,Windsor.Spring.net等)

我一直在搜索依赖注入并阅读一些文章.但我仍然无法找出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

45
推荐指数
2
解决办法
2万
查看次数

IoC容器的示例

有没有人有很好的IoC容器示例(最好是在c#中)以及使用它们的方式和原因?我查看了维基页面艾恩德的例子,但我还没有完全理解这个概念.

我应该何时何地使用IoC容器?

c# inversion-of-control

44
推荐指数
3
解决办法
5万
查看次数

IoC.Resolve与构造函数注入

我听到很多人说使用IoC.Resolve()是一种不好的做法,但我从来没有听说过一个很好的理由(如果它只是测试而不是你可以嘲笑容器,那么你已经完成了).

现在使用Resolve而不是Constructor Injection的优点是你不需要在构造函数中创建具有5个参数的类,并且无论何时你要创建该类的实例,你都不需要提供它.什么

.net ioc-container inversion-of-control

44
推荐指数
3
解决办法
1万
查看次数

Simple Injector vs Hiro vs Autofac

我是DI和IoC的新手,我正在尝试决定学习哪个IoC容器.我已经看到了几个性能比较,其中引用的三个容器似乎表现得非常好.但是,我没有找到包含Hiro或Simple Injector的功能比较.Autofac的社区似乎是最大的,但Hiro和Simple Injector在基准测试中非常快,而Simple Injector尤其声称非常容易学习.也就是说,我不想学习一个并且必须切换到另一个因为功能集有限.出于这个原因,我倾向于Autofac,因为它相当成熟,功能齐全(这里这里的好文章),也是最快的IoC容器之一.有没有人对这三个容器中至少有两个有过经验?你能提供任何功能比较吗?

.net dependency-injection inversion-of-control autofac simple-injector

44
推荐指数
1
解决办法
2万
查看次数

什么是"针对接口而不是对象的代码"的Python版本?

灵感来自一个很好的问题(和一堆很棒的答案).

语句"针对接口的代码,而不是对象"在Python中是否有任何意义?

我正在寻找像原始问题中的答案,但有Python片段和想法.

python oop interface inversion-of-control

43
推荐指数
3
解决办法
8300
查看次数

依赖性倒置原则(SOLID)与封装(OOP的支柱)

我最近讨论了依赖性倒置原则,控制反转依赖注入.关于这个主题,我们一直在争论这些原则是否违反了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

43
推荐指数
2
解决办法
4585
查看次数

Asp.Net Core:注册实现多个接口和生活方式Singleton

考虑以下接口和类定义:

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)

c# dependency-injection inversion-of-control asp.net-core

41
推荐指数
3
解决办法
1万
查看次数