Tag: inversion of control

无法解析从外部DLL加载的控制器

我正在使用MVC4 Web API构建一个Web API,其中包含一个IoC容器(在这种情况下是简单注入器,但我不认为这个问题与该容器有关),它应该公开各种CRUD和查询操作。 在我的案例中使用IOC的原因是我们是一个开发商店,我需要能够让客户构建自己的Web API控制器,以暴露他们需要从我们的系统公开需要的数据。 因此,我希望设计我的解决方案的方式允许我通过IOC制作所有控制器,包括我们和我们的客户,外部和可加载的产品。 该网站没有任何对该库的引用,但该库包含我想在网站中使用的控制器。 类型在容器中注册,DependencyResolver设置为自定义依赖项解析程序。 我有代码找到dll插件并加载控制器类型,但当我尝试导航到它将代表它的路线时说它无法找到它。 即如果我尝试导航到/ api / Test1Api我应该看到文本“hello world” 我的问题是虽然我已经加载了我的控制器类型,但我无法将其转换为网站所说的路线。 我收到了错误 未找到与请求URI匹配的HTTP资源 未找到与名为“Test1Api”的控制器匹配的类型。 这是我如何注册容器 public static class SimpleInjectorInitializer { /// Initialize the container and register it as MVC3 Dependency Resolver. public static void Initialize() { //// Did you know the container can diagnose your configuration? Go to: http://bit.ly/YE8OJj. // […]

IoC容器是否取代了工厂的使用

我刚刚开始使用IoC容器,如果这是一个愚蠢的问题,请道歉。 我在应用程序中有如下代码 internal static class StaticDataHandlerFactory { public static IStaticDataHandler CreateHandler(StaticDataUpdate staticDataUpdate) { if (staticDataUpdate.Item is StaticDataUpdateOffice) { return new OfficeUpdateHandler(); } if (staticDataUpdate.Item is StaticDataUpdateEmployee) { return new EmployeeUpdateHandler(); } if (staticDataUpdate.Item == null) { throw new NotImplementedException( string.Format(“No static data provided”)); } else { throw new NotImplementedException( string.Format(“Unimplemented static data type of {0}”, […]

控制台应用程序的dependency injection和项目结构

我有4个项目: 核心(IServer): 系统 System.Core程序 DependencyResolver: 核心 StructureMap 基础设施(服务): 核心 外部依赖 安慰: 核心 DependencyResolver Requierements: 我试图只在DependencyResolver中使用StructureMap。 此外,控制台应用程序不应该了解有关Infrastucture的任何信息。 当我不想在我的控制台应用程序上引用StructureMap时,我必须构建一个ServiceLocator。 在DependencyResolver中我有一个Bootstrapper负责调用StructureMap注册表内容(Register) 在我的控制台应用程序中,我想获得一个实例。 为此,我需要引用StructureMap。 另一种方法是在StructureMaps解析方法周围编写一个小包装器。 还有其他更好的方法将控制台与StructureMap分离吗?

在MVC应用程序中使用IoC框架有什么用?

我试图理解像StructureMap这样的IoC框架的使用,但我不禁想到这些“设计模式”只是无意义,使代码变得更加复杂。 让我先举一个例子,我认为IoC有点用处。 我认为在处理MVC框架中控制器类的实例化时,IoC可能很有用。 在这种情况下,我正在考虑.NET MVC框架。 通常,控制器类的实例化由框架处理。 这意味着您无法将任何参数传递给控制器​​类的构造函数。 这就是IoC框架可以派上用场的地方。 在IoC容器中的某处,您可以指定在调用控制器类时应该实例化哪个类并将其传递给控制器constructor 。 当您想要对控制器进行unit testing时,这也很方便,因为您可以模拟传递给它的对象。 但就像我说的,我可以理解为什么人们想将它用于控制器类。 但不是在那之外。 从那以后,您可以简单地执行正常的dependency injection 。 但为什么不简单地这样做: public class SomeController { public SomeController() : this( new SomeObj() ) { } publiv SomeController(SomeObj obj) { this.obj = obj; } } 现在您不必使用任何第三方IoC框架,这也意味着更低的学习曲线。 既然您不必深入了解该框架的规范。 您仍然可以在unit testing中模拟对象。 所以也没问题。 你唯一可以说的是,“但现在你的class级与 SomeObj 紧密 SomeObj ”。 这是真的。 但谁在乎!? 这是一个控制器类! 我永远不会重复使用那个类..那么为什么我要担心这种紧耦合……? 我可以模拟传递给它的对象。 […]

如何将AutoMapper与Ninject.Web.Mvc一起使用?

建立 我有一个AutoMapperConfiguration静态类,用于设置AutoMapper映射: static class AutoMapperConfiguration() { internal static void SetupMappings() { Mapper.CreateMap.ConvertUsing<IdToEntityConverter>(); } } 其中IdToEntityConverter是一个自定义的ITypeConverter ,如下所示: class IdToEntityConverter : ITypeConverter where T : Entity { private readonly IRepository _repo; public IdToEntityConverter(IRepository repo) { _repo = repo; } public T Convert(ResolutionContext context) { return _repo.GetSingle(context.SourceValue); } } IdToEntityConverter在其构造函数中获取IRepository ,以便通过命中数据库将ID转换回实际实体。 请注意它没有默认构造函数。 在我的ASP.NET的Global.asax ,这就是我对OnApplicationStarted()和CreateKernel() : protected override void […]

具有相同接口的多个实现的Autofac

我正在使用Autofac,并希望有多个接口实现。 如何配置Autofac以便根据当前类型解析依赖关系? 更具体地说,我有一个接口和多个应该链接在一起的实现。 让我解释一下(虚拟课程): public interface IMessageHandler { void Handle(Message message); } public class LoggingMessageHandler : IMessageHandler { private IMessageHandler _messageHandler; public LoggingMessageHandler(IMessageHandler messageHandler) { _messageHandler = messageHandler; } public void Handle(Message message) { // log something _messageHandler.Handle(message); } } public class DoSomethingMessageHandler : IMessageHandler { private IMessageHandler _messageHandler; public DoSomethingMessageHandler (IMessageHandler messageHandler) { _messageHandler […]

如何在Windows窗体中的构造函数中注入依赖项

在asp.net-mvc中,我有Windsor Controller Factory,它将所有依赖项注入到控制器中,但是如何在Windows窗体中获得它? 例如,如果有这个Form1,我将如何获得Form1的实例,我应该使用resolve(由某个ppl称为ServiceLocator和反模式)? public class Form1 { private IBarService _barService; public Form1(IBarService barService) { _barService = barService; } }

有人能详细解释一下如何使用IOC容器吗?

我通过参数和构造函数广泛使用dependency injection。 我理解这个学位的原则并对此感到满意。 在我的大型项目中,我最终注入了太多的依赖项(任何达到双重数字的东西都感觉很大 – 我喜欢“通心粉代码”这个术语)。 因此,我一直在考虑IOC容器。 我已经阅读了一些关于它们的文章,到目前为止我没有看到它的好处。 我可以看到它如何协助发送相关对象组或一次又一次地获取相同类型。 我不确定他们如何在我的项目中帮助我,我可能有超过一百个类实现相同的界面,并且我在不同的顺序中使用它们。 那么,任何人都能指出一些不仅描述IOC容器概念的好文章(最好不要特别夸大其中),还要详细说明它们在这类项目中如何使我受益,以及它们如何适合我的范围。一个大型的建筑? 我希望看到一些非语言特定的东西,但如果有必要我的首选语言是C#。

配置Unity以解析采用装饰依赖项的类型,该依赖项的参数随注入的类型而变化

这是一个相当简单的装饰器模式场景,其复杂性在于,装饰类型具有一个构造函数参数,该参数取决于它被注入的类型。 我有这样的界面: interface IThing { void Do(); } 这样的实现: class RealThing : IThing { public RealThing(string configuration) { … implementation … } public void Do() { … implementation … } } 像这样的装饰者: class DecoratingThing : IThing { IThing _innerThing; public DecoratingThing(IThing thing) { _innerThing = thing; } public void Do() { _innerThing.Do(); } } 最后,我有一些需要IThing类型,称为Depender1 […]

如何在Autofac中注册许多开放式通用

我是Autofac的新手 (不是DI )。 情况如下: 我有这些接口: public interface IQuery : IQuery { } public interface IQueryHandler where TQuery : IQuery { TResult Handle(TQuery query); } 在我的解决方案中有很多实现: class GetPersonQuery : IQuery { } class GetPersonQueryHandler : IQueryHandler { } class GetArticleQuery : IQuery { } class GetArticleQueryHandler : IQueryHandler { } class GetSomethingQuery : IQuery<IEnumerable> { } […]