相关疑难解决方法(0)

依赖注入(DI)"友好"库

我正在思考一个C#库的设计,它将有几个不同的高级函数.当然,这些高级功能将尽可能使用SOLID类设计原则来实现.因此,可能存在供消费者定期直接使用的类,以及作为那些更常见的"最终用户"类的依赖性的"支持类".

问题是,设计库的最佳方法是:

  • DI不可知 - 虽然为一个或两个常见的DI库(StructureMap,Ninject等)添加基本的"支持"似乎是合理的,但我希望消费者能够将该库与任何DI框架一起使用.
  • 非DI可用 - 如果库的使用者没有使用DI,那么库应该仍然尽可能容易使用,减少了用户为创建所有这些"不重要"的依赖关系而必须完成的工作量.他们想要使用的"真实"类.

我目前的想法是为常见的DI库提供一些"DI注册模块"(例如,一个StructureMap注册表,一个Ninject模块),以及一个非DI的集合或工厂类,并包含与这几个工厂的耦合.

思考?

c# dependency-injection inversion-of-control

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

使用IoC进行单元测试

如何将IoC容器用于单元测试?使用IoC在大型解决方案(50多个项目)中管理模拟是否有用?有经验吗?任何C#库在单元测试中都能很好地使用它吗?

c# unit-testing mocking inversion-of-control

97
推荐指数
3
解决办法
4万
查看次数

什么是依赖注入上下文中的组合根

我正在探索依赖注入,并且在整个地方使用术语组合根.那是什么?

dependency-injection inversion-of-control

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

我应该在哪里注射Ninject 2+(我如何安排我的模块?)

我有一个解决方案,有两个相关的(对这个问题)项目,还有一些其他项目;

  1. 具有其他几个项目使用的功能的类库.
  2. ASP.NET MVC应用程序.

我的问题基本上是我应该使用Ninject 2做IoC,考虑到......

  • 类库需要一些DI爱,其中包括需要Web请求特定会话对象的存储库类(想想工作单元).
  • MVC应用程序需要DI,因为在Ninject 2中你基本上都是从NinjectHttpApplication继承的.
  • 类库的单元测试需要注意这一点,以注入一组不同的存储库.
  • 出于同样的原因,需要注入Web应用程序的单元测试.

我把自己画成了一个心理角落,因为我只看到了三个选项.类库中的DI,Web应用程序中的DI,或两者都有,但每个都有问题:

  • 我不能在类库中做DI ,因为MVC应用程序需要从NinjectHttpApplication继承而开始.
  • 我不能只在MVC应用程序中执行DI - 毕竟,类库是由其他库使用的,并且MVC应用程序不应该对库的内部结构有太多了解.
  • 我想这是我能看到的唯一出路:两个项目的独立IoC.类库和MVC应用程序都有自己的IoC设置,并为他们的东西做DI,而不是真正关心彼此.

有没有人对如何做这样的事情有一些"最佳实践"或指导方针?我无法想象我是第一个在这种情况下结束的人,而且知道"正确"的做法是什么肯定会很好......

谢谢!

asp.net-mvc ninject inversion-of-control

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

我们是否有效地使用IoC?

所以我的公司使用Castle Windsor IoC容器,但感觉"关闭":

  • 所有数据类型都在代码中注册,而不是在配置文件中注册.
  • 所有数据类型都是硬编码的,以使用一个接口实现.事实上,对于几乎所有给定的接口,只有一个实现.
  • 所有已注册的数据类型都具有默认构造函数,因此Windsor不会为任何已注册的类型实例化对象图.

设计系统的人坚持认为IoC容器使系统更好.我们有1200多个公共类,所以它是一个很大的系统,你期望找到像Windsor这样的框架.但我仍然持怀疑态度.

我的公司是否有效地使用IoC?使用Windsor的新对象比使用new关键字的新对象更有优势吗?

design-patterns castle-windsor ioc-container

17
推荐指数
1
解决办法
919
查看次数

N层开发中的DDD概念

在花了几个月研究DDD方法之后,我现在开始将这些概念应用到我公司的实际产品中.事实上,我的任务是为未来的开发创建一个合适的,可维护的架构.

我们决定使用以下技术:EF4(真正的v2),Unity

我获得的信息量最具启发性,但是,我在最佳实践中留下了几个问题:

问题#1: DTO - 最佳实践

我有我的域对象(PO​​CO类).有几种方法可以实现这些类.

  1. 传统方法:创建包含公共getter/setter,Validation和适当业务逻辑的POCO类.还要创建DTO并使用映射技术来管理它们.(Automapper)
  2. 传统 - DTO:创建如上所述的POCO类,但是,使用您的POCO作为传输对象.我的理解是业务对象永远不应该离开域.
  3. 混合:我偶然发现了一篇有趣的博客文章,其中作者创建了他的POCO对象和DTO.在他的域对象内部,他创建了一个DTO实例.这样可以更轻松地维护,因为您不会像#1那样复制属性.像这样:
public abstract class POCOBase<T> : ValidationBase, IPOCO where T : DTOBase, new()
{

 public T Data { get; set; }

 public POCOBase()
 {
     Data = new T();
 }

 public POCOBase(T dto)
 {
     Data = dto;
 }
  }

  public class SomePOCO : POCOBase { }

  public class SomeDTO : DTOBase

  {

 public String Name { get; set; }

 public String Description { get; set; }

 public …

.net domain-driven-design n-tier-architecture n-layer

11
推荐指数
1
解决办法
3329
查看次数

Xml配置还是通过代码配置?

我个人喜欢从C#代码配置StructureMap的选项.根据我的理解,DI的优点之一是我们可以轻松交换新的具体实例.但是,如果配置是在代码中定义的,那么具体实例在dll中是硬编码的.

所以,实际上,它与硬件编码依赖关系一样好,对吧?我知道,在测试过程中它会让生活更轻松......

我的观点是,使用xml配置不是更好吗?你想插入一个新的具体实例?只需让安装程序用新的文件覆盖structuremap.config文件.

那么,配置StructureMap的首选方法是什么?

额外:我暂时被迫使用C#配置,因为我不知道如何将连接字符串传递给实例.我可以在配置文件中编写连接字符串,但我想重用app.config中定义的连接字符串.

structuremap dependency-injection inversion-of-control

10
推荐指数
2
解决办法
2535
查看次数

关于工厂模式的神话

这让我困扰了一段时间,如果这是一个神话,我没有任何线索.

似乎工厂模式可以减轻为类添加依赖项的痛苦.

例如,在一本书中,它有类似的东西

假设您有一个名为Order的类.最初它并不依赖于任何东西.因此,您不必费心使用工厂来创建Order对象,而您只是使用plain new来实例化对象.但是,您现在要求必须与客户关联创建订单.您需要更改百万个位置才能添加此额外参数.如果您只为Order类定义了一个工厂,那么您可以在没有同样痛苦的情况下满足新要求.

这与为构造函数添加额外参数有何不同?我的意思是你仍然需要为工厂提供一个额外的论据,而且还有百万个地方使用,对吗?

factory-pattern

8
推荐指数
1
解决办法
473
查看次数

大型项目中的最佳IoC实践

您发现哪些技术对于使用Inversion of Control容器管理大型项目的依赖性很有用?

你是在一个地方引导所有东西,还是将它拆分?

你有没有使用过多个容器?

dependency-injection inversion-of-control

7
推荐指数
1
解决办法
668
查看次数

autofac - 在多模块应用程序中正确使用

我正在开发一个由许多模块组成的应用程序,其中一些模块依赖于其他模块.我现在决定使用Autofac来解决循环依赖关系并改进体系结构.

要配置autofac,我使用xml方法(http://code.google.com/p/autofac/wiki/XmlConfiguration).

现在我不确定如何实现Autofac.我是否需要在应用程序的每个模块中引用autofac?这意味着我每次想要解决依赖关系时都必须注册所有组件...

ContainerBuilder builder = new ContainerBuilder();
builder.RegisterModule(new ConfigurationSettingsReader("autofac", configPath));
IContainer container = builder.Build();
IWhatever w = container.Resolve<IWhatever>();
Run Code Online (Sandbox Code Playgroud)

这是这样做的吗?

或者在单独的模块中包装Autofac更好吗?使用这种方法,我只需要注册一次模块(当应用程序启动时),并且可以使用包装的Autofac来解决依赖关系......

IWhatever w = container.Resolve<IWhatever>();
Run Code Online (Sandbox Code Playgroud)

我希望有人能告诉我使用Autofac的最佳方法.

谢谢!

c# architecture autofac

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