引用依赖注入的大多数示例,我们也可以使用工厂模式解决.看起来在使用/设计时,依赖注入和工厂之间的差异是模糊的还是薄的.
一旦有人告诉我你如何使用它会有所作为!
我曾经使用StructureMap一个DI容器来解决问题,后来我重新设计它以使用一个简单的工厂并删除了对StructureMap的引用.
任何人都可以告诉我他们之间的区别是什么,在哪里使用什么,这里最好的做法是什么?
我的应用程序中将包含以下组件
我希望使用Castle Windsor作为IoC来粘合各层,但我对胶合的设计有点不确定.
我的问题是谁应该负责将物品注册到温莎?我有几个想法;
有人可以用不同的途径帮助我提出一些想法和利弊吗?以这种方式利用Castle Windsor的示例项目的链接将非常有用.
我有一个解决方案,有两个相关的(对这个问题)项目,还有一些其他项目;
我的问题基本上是我应该使用Ninject 2做IoC,考虑到......
我把自己画成了一个心理角落,因为我只看到了三个选项.类库中的DI,Web应用程序中的DI,或两者都有,但每个都有问题:
有没有人对如何做这样的事情有一些"最佳实践"或指导方针?我无法想象我是第一个在这种情况下结束的人,而且知道"正确"的做法是什么肯定会很好......
谢谢!
我在一个大型平台项目上工作,支持大约10个使用我们代码的产品.
到目前为止,所有产品都使用了我们平台的全部功能:
- 从数据库中检索配置数据
- 远程文件系统访问
- 安全授权
- 基本逻辑(我们付费提供的东西)
对于新产品,我们被要求在没有平台带来的基础设施的情况下支持较小的功能子集.我们的架构很旧(从2005年左右开始编码),但相当稳固.
我们相信我们可以在我们现有的课程中使用DI来做到这一点,但估计这样做的时间从5到70周不等,取决于你与谁交谈.
有很多文章告诉你如何做DI,但我找不到任何告诉你如何以最有效的方式重构DI?是否有工具可以执行此操作而不必通过30.000行代码并且必须按CTRL + R来移除接口并将它们添加到构造函数中太多次?(如果有帮助,我们有resharper)如果没有,你发现什么是快速实现这一目标的理想工作流程?
c# refactoring dependencies dependency-injection code-injection
我有一个简单的问题.
假设我有一个.Net解决方案,有不同的项目,比如一些类库(bll,dal等)和一个可以是web应用程序或wpf应用程序的主项目,这没关系.
现在假设我想使用IoC容器(如Windsor,Ninject,Unity等)来解析验证器,存储库,通用接口实现等问题.
我把它们放在一起.编译并运行良好.然后,有一天,我添加了一个新服务,在我的代码中,我只是尝试通过IoC容器解决它.事实是,我忘记在IoC配置中注册它.
所有内容都会编译,应用程序将被部署并运行.一切正常,除了页面的代码要求容器的新服务,容器回答"嘿,我对此服务一无所知".
您将记录您的错误,以及用户友好的错误页面.您将检查错误,查看问题并进行修复.很标准.
现在让我们说我们想要改进这个过程,并且在某种程度上能够在编译时知道我们期望IoC容器处理的每个服务是否在代码中正确注册.
怎么能实现这一目标?有一件事,单元测试被排除在可能的答案之外,我正在寻找另一种方式,如果确实存在的话.
思考?
编辑 - 经过一些回答和评论,似乎单元测试确实是实现此功能的唯一方法.
我想知道的是,如果单元测试 - 由于任何原因 - 不可能,因此IoC无法在编译时进行测试,这是否会阻止您使用IoC容器并选择在代码中进行直接实例化?我的意思是,您是否认为使用IoC和后期绑定太不安全和冒险,并认为其优势被这个"缺陷"所超越?
.net error-handling dependency-injection build inversion-of-control
我正在开展一个侧面项目,以更好地理解控制和依赖注入的反转以及不同的设计模式.
我想知道在工厂和战略模式中使用DI是否有最佳实践?
我的挑战来自于一个策略(从工厂构建)需要为每个可能的构造函数和实现提供不同的参数.结果,我发现自己在服务入口点声明了所有可能的接口,并将它们传递给应用程序.因此,必须针对新的和各种策略类实现更改入口点.
为了便于说明,我在下面汇总了一个配对示例.我的这个项目的堆栈是.NET 4.5/C#和Unity for IoC/DI.
在此示例应用程序中,我添加了一个默认的Program类,负责接受虚构的订单,并根据订单属性和所选的送货提供商计算运费.UPS,DHL和Fedex有不同的计算方法,每个实现可能依赖或不依赖于其他服务(访问数据库,api等).
public class Order
{
public string ShippingMethod { get; set; }
public int OrderTotal { get; set; }
public int OrderWeight { get; set; }
public int OrderZipCode { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
用于计算运费的虚拟计划或服务
public class Program
{
// register the interfaces with DI container in a separate config class (Unity in this case)
private readonly IShippingStrategyFactory _shippingStrategyFactory;
public Program(IShippingStrategyFactory shippingStrategyFactory)
{
_shippingStrategyFactory = shippingStrategyFactory;
}
public …Run Code Online (Sandbox Code Playgroud) c# design-patterns dependency-injection strategy-pattern factory-pattern
在这种情况下,我有多个摄像头(rtspsrc)和一个singleton元素,它们对传入的视频流进行分析。我称它为单例元素,因为它具有请求源和接收器垫。应用程序中应该只存在其中之一,因为它可以在GPU上运行,并且可以通过批量处理获得更好的性能。将我正在构建的应用程序视为API,以添加相机,移除相机,打开和关闭每个相机的分析等。相机将对其进行分析,捕获结果并继续发送。麻烦的是,我需要共享一个Gstreamer元素(分析元素)。
因此,我有多个摄像头,将其馈入单个元素,然后馈入至appsink。这相当有效,但我希望能够:
rtspsrc都完全隔离,这样一个错误就不会影响整个管道如果我将所有摄像机都放在管道中,则无法弄清楚如何暂停特定摄像机。我无法暂停整个管道,因为这将停止所有摄像机。我想出的最好办法是删除并与特定摄像机的元素不同,然后在恢复时重新添加并重新链接。这有点。如果某个特定对象rtspsrc停止响应,则整个管道都将停止。如果rtspsrc不存在特定内容,则整个管道不会过渡到PLAYING状态
我应该如何设计我的应用程序?您认为我应该只有一条大型管道吗?还是应该有一个包含单例分析元素的管道,以及每个摄像机的管道,然后使用appsink和appsrc将它们连接起来?这种方法可能会使处理事情变得更容易,因为每个管道都是完全独立的?
让我知道您是否需要更多信息。
我有一个基本上只是一个MVC项目的项目,因为它为Razor视图和库(Mvc.Mailer)提供了智能感知HttpContext.现在我必须加载一个页面,以便我MvcApplication的运行中的构造函数,或者Application_Start,或Init.
有没有办法引导mvc app main方法,或者在不要求我发送页面加载请求的任何页面请求之前调用的任何东西?
我最近一直在做我的第一个测试驱动开发项目,并且一直在学习Ninject和MOQ.这是我对这一切的第一次尝试.我发现TDD方法一直在发人深省,Ninject和MOQ一直很棒.我正在开发的项目并不特别适合Ninject,因为它是一个高度可配置的C#程序,旨在测试Web服务接口的使用.
我已将其分解为模块并在整个商店中都有接口,但我仍然发现在从Ninject内核获取服务的实现时我必须使用大量的构造函数参数.例如;
在我的Ninject模块中;
Bind<IDirEnum>().To<DirEnum>()
Run Code Online (Sandbox Code Playgroud)
我的DirEnum课程;
public class DirEnum : IDirEnum
{
public DirEnum(string filePath, string fileFilter,
bool includeSubDirs)
{
....
Run Code Online (Sandbox Code Playgroud)
在我的Configurator类中(这是主入口点)将所有服务挂钩在一起;
class Configurator
{
public ConfigureServices(string[] args)
{
ArgParser argParser = new ArgParser(args);
IDirEnum dirEnum = kernel.Get<IDirEnum>(
new ConstructorArgument("filePath", argParser.filePath),
new ConstructorArgument("fileFilter", argParser.fileFilter),
new ConstructorArgument("includeSubDirs", argParser.subDirs)
);
Run Code Online (Sandbox Code Playgroud)
filePath,fileFilter和includeSubDirs是程序的命令行选项.到现在为止还挺好.然而,作为一个尽职尽责的人,我有一个覆盖这段代码的测试.我想使用MOQ对象.我为我的测试创建了一个Ninject模块;
public class TestNinjectModule : NinjectModule
{
internal IDirEnum mockDirEnum {set;get};
Bind<IDirEnum>().ToConstant(mockDirEnum);
}
Run Code Online (Sandbox Code Playgroud)
在我的测试中,我像这样使用它;
[TestMethod]
public void Test()
{
// Arrange
TestNinjectModule testmodule = new TestNinjectModule();
Mock<IDirEnum> mockDirEnum = new Mock<IDirEnum>();
testModule.mockDirEnum = …Run Code Online (Sandbox Code Playgroud) 我有 ac# 网络服务。当我收到新请求时,我创建一个日志记录实例。我有许多其他类的实例来处理请求,我希望它们也记录下来。共享日志记录实例而不将其传递到构造函数或属性中的最佳方法是什么?
c# ×5
ninject ×2
.net ×1
architecture ×1
asp.net-mvc ×1
build ×1
dependencies ×1
gstreamer ×1
instance ×1
logging ×1
moq ×1
mvcmailer ×1
refactoring ×1
tdd ×1
video ×1