Tag: simple injector

无法解析从外部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. // […]

通用命令处理程序的简单注入器用法

接口,命令和命令处理程序按照Simpleinjector wiki中的说明进行设置。 public interface ICommand { string Name { get; set; } } public class Command1 : ICommand { public string Name { get; set; } } public class Command2 : ICommand { public string Name { get; set; } } public interface ICommandHandler { void Execute(TCommand Command); } public class Command1Handler : ICommandHandler { […]

如何使用WebAPI,WCF,SignalR和后台任务在MVC Web应用程序中配置简单的注入器容器和lifestylse

简单的注入器文档提供了有关如何为WebRequest,Web API,WCF设置容器的很好示例……但这些示例一次特定于一种技术/生活方式。 我们的Web应用程序大部分使用它们! 我不清楚如何配置容器以适应多种生活方式。 假设我有一个带有Web API的MVC项目。 我有以下对象: MyDbContext:我的实体代码第一个db上下文 由MyDataProvider实现的IMyDataProvider:包含查询逻辑并使用MyDbContext MyController:使用IMyDataProvider的MVC控制器 MyApiController:使用IMyDataProvider的WebApi控制器 我应该为每种生活方式创建和配置一个容器吗? 当我使用RegisterPerWebRequest注册所有内容时, RegisterPerWebRequest适用于两种类型的控制器。 这样安全吗? 或者在Web API控制器中使用async / await时会遇到麻烦吗? 当我同时注入相同实例的MVC和Web API控制器时,最佳配置是什么? 我应该使用混合生活方式吗? 现在让事情变得复杂……我们的应用程序也使用后台任务和SignalR。 这些都有时会发生在WebRequest之外,并且需要访问如上所述的相同对象。 最好的解决方案是使用Lifetime范围? 我是否需要为这种生活方式创造一个新的容器? 或者我可以重用/重新配置我的MVC / Web API容器吗? 有三重生活方式吗?

使用Simple Injector在C#中实现域事件处理程序模式

我正在尝试使用Simple Injector在C#中实现域事件模式。 我已经将我的代码简化为一个文件,该文件可以作为控制台应用程序运行,并且已经排除了Simple Injector代码,以便为此问题保持清晰。 我IEvent的问题是每个事件可能有多个事件处理程序,并且可能会引发多个事件,但我想限制我的Dispatcher只处理实现IEvent接口的事件,所以我把这个限制放在我的Dispatch方法上。 这导致了如何从Simple Injector获取实例的问题,因为每次调用Dispatch方法时TEvent都是IEvent类型(正如我所期望的那样)但是我需要获取传入的事件类型以便我可以获得相关的Simple Injector的处理程序。 希望我的代码能够更好地解释这个: interface IEvent { } interface IEventHandler where T : IEvent { void Handle(T @event); } class StandardEvent : IEvent { } class AnotherEvent : IEvent { } class StandardEventHandler : IEventHandler { public void Handle(StandardEvent @event) { Console.WriteLine(“StandardEvent handled”); } } class AnotherEventHandler : IEventHandler { […]

使用Simple Injector将依赖项注入OWIN Middleware和每个Web请求

我试图找出如何最好地将我的所有依赖项注入我为Web API应用程序编写的自定义OWIN中间件。 一个简单的例子就是我正在使用的DbContext。 我有一些中间件需要根据请求进行潜在查询。 我遇到的问题是我希望我的DbContext具有WebApiRequestLifestyle范围。 我的DbContext注册如下: container.Register(Lifestyle.Scoped); 显然,这不起作用: container.Options.DefaultScopedLifestyle = new WebApiRequestLifestyle(); 因为我需要在我的中间件中使用MobileDbContext,例如: app.CreatePerOwinContext(() => { return container.GetInstance(); }; 我尝试了一种混合生活方式,但这也没有用,因为我不认为中间件在技术上是不属于“范围”生活方式的东西。 我想,它可能更接近单身人士。 有没有更好的方法来设计我的应用程序,以避免这个问题或通过某种自定义范围的生活方式解决它?

使用简单的注入器注册Web API控制器的子集

我手动注册我项目的Web API控制器的一个子集: container.Register(typeof(ILGTWebApiController), controllerType, Lifestyle.Transient); 工作良好。 但是,当我跑: GlobalConfiguration.Configuration.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(container); 它似乎影响项目中的所有 Web API控制器。 我想通过简单的喷射器保持其他的不受影响。 如果我不运行上面的代码,简单的注入器会抱怨我的控制器没有空的构造函数(他们显然不会,因为我正在使用DI)。

简单的注射器诊断警告一次性瞬态

我正在尝试配置简单的注入器工作,但我似乎无法通过这个。 我按照说明如何在此链接中修复此问题,但它不起作用。 这是错误消息: NotificationEntities注册为transient,但实现了IDisposable。 这是SimpleInjectorInitializer.cs的代码 public static void Initialize() { var container = new Container(); container.Options.DefaultScopedLifestyle = new WebRequestLifestyle(); InitializeContainer(container); container.RegisterMvcControllers(Assembly.GetExecutingAssembly()); container.Verify(); DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container)); } private static void InitializeContainer(Container container) { container.Register(); } NotificationEntities是从EF生成的,所以它应该已经实现了,对吗?

使用简单的注入器和Umbraco控制器

我正在尝试将依赖项注入到一个控制器中,该控制器inheritance自Umbraco的RenderMvcController并获取错误 无法注册RenderMvcController类型,无法进行隐式注册。 为了能够创建RenderMvcController的容器,它应该只有一个公共构造函数:它有3个。有关更多信息,请参阅https://simpleinjector.org/one-constructor 。 下面是我连接DI的代码 var container = new Container(); container.Options.DefaultScopedLifestyle = new WebRequestLifestyle(); InitializeContainer(container); container.RegisterMvcControllers(Assembly.GetExecutingAssembly()); container.Verify(); DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container)); private static void InitializeContainer(Container container) { container.Register(Lifestyle.Transient); container.Register(Lifestyle.Transient); } 这是接收依赖的类的一个例子,它inheritance自我写的基类 public class NewsroomController : BaseRenderMvcController { public NewsroomController(ICacheService cacheService) : base(cacheService) { } 基类扩展了RenderMvcController,它是一个Umbraco控制器 public class BaseRenderMvcController : RenderMvcController { public ICacheService CacheService { get; set; […]

Simple Injector – 使用参数注册foreach类型

我一直在使用Autofac作为DI Container,它很棒,但它有点太慢了。 所以我决定将我的项目迁移到Simple Injector,因为我已经看到了一些基准测试,而且它是最快的之一。 但是我认为它的API缺乏一点,但我确信有一些解决方法可以解决我的问题。 我正在扫描两个程序集以获取它们的类型,因为我想以自动方式注册它们: var repositories = (from type in typeof(DataRepository).Assembly.GetExportedTypes() where type.Name.EndsWith(“Repository”) select type).OrderBy(t => t.Name).ToList(); var repositioriesImp = (from type in typeof(SqlDataRepository).Assembly.GetExportedTypes() where type.Name.EndsWith(“Repository”) select type).OrderBy(t => t.Name).ToList(); 所以我决定将他们的类型保存在字典中 var dictionary = repositories.Zip(repositioriesImp, (r, rImp) => new { r, rImp }) .ToDictionary(x => xr, x => x.rImp); 在单个foreach循环中检索它们 foreach(var d in […]

简单的注入器,不能覆盖现有的注册

我目前第一次使用Simple Injector。 在我的.NET项目中,我正在运行测试和模拟从Web服务返回的数据并将对象注册到容器中 _container.Register(() => mock.Object, Lifestyle.Transient); 这很好用。 但在我的测试中,我想在第二次调用包含更新数据的Web服务时测试系统的行为,因此需要更新模拟对象。 默认情况下,Simple Injector不允许覆盖现有注册,但官方网站声明可以更改此行为,如下所示。 https://simpleinjector.readthedocs.org/en/latest/howto.html#override-existing-registrations container.Options.AllowOverridingRegistrations = true; 不幸的是,当我尝试第二次注册对象时,即使使用上面的代码,我仍然会收到错误。 首次调用GetInstance,GetAllInstances和Verify后,无法更改容器 有关为何发生这种情况的任何想法?