Tag: simple injector

在Web API和OWIN中使用Simple Injector

我遇到了与此处描述的相同的问题,我的设置几乎与此实际上基于本指南相同 。 当我在我的控制器中访问一个方法时,我得到了这个 尝试创建“TestController”类型的控制器时发生错误。 确保控制器具有无参数的公共构造函数。 这是堆栈跟踪 at System.Web.Http.Dispatcher.DefaultHttpControllerActivator .Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)\r\n at System.Web.Http.Controllers.HttpControllerDescriptor .CreateController(HttpRequestMessage request)\r\n at System.Web.Http.Dispatcher.HttpControllerDispatcher.d__1.MoveNext() 这是内部exception的堆栈跟踪 at System.Linq.Expressions.Expression.New(Type type)\r\n at System.Web.Http.Internal.TypeActivator.Create[TBase](Type instanceType)\r\n at System.Web.Http.Dispatcher.DefaultHttpControllerActivator .GetInstanceOrActivator(HttpRequestMessage request, Type controllerType, Func`1& activator)\r\n at System.Web.Http.Dispatcher.DefaultHttpControllerActivator .Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType) 这是我的控制器的样子 public class TestController : ApiController { private readonly ITestRepo _repo; public […]

在unit testing中使用DI容器

我们一直在使用Simple Injector取得了很好的成功,在一个相当实际的应用程序中。 我们一直在为所有生产类使用构造函数注入,并配置Simple Injector来填充所有内容,而且一切都很好。 但是,我们没有使用Simple Injector来管理unit testing的依赖树。 相反,我们一直在手动创新。 我花了几天时间完成了一次重大的重构,几乎所有的时间都是在我们的unit testing中修复这些手动构造的依赖树。 这让我感到疑惑 – 有没有人有任何模式用于配置他们在unit testing中使用的依赖树? 对我们来说,至少在我们的测试中,我们的依赖树往往相当简单,但有很多。 任何人都有他们用来管理这些的方法吗?

使用具有Castle Proxy Interceptor的Simple Injector

我在我的asp.net mvc 4项目中使用Simple Injector。 我无法弄清楚如何使用带有城堡代理拦截器的Simple Injector。

Winforms:如何使用IoC容器注册表单

背景 我正在构建一个winforms应用程序,我正在使用IoC容器(SimpleInjector)来注册我的类型。 在我的应用程序中,大多数屏幕(即表单)在任何给定时间只有一个实例。 问题 对于在任何给定时间只需要一个实例的表单,我可以将它们注册为单例: container.Register(Lifestyle.Singleton); 这允许我使用容器来跟踪所有表单。 但是,在这种情况下,当表单被关闭时,它将被处理掉(表单实现IDisposable)。 如果应用程序尝试使用容器再次打开该表单,则将处理该表单的容器实例,并抛出exception。 题 处理这个问题的正确方法是什么? 我目前看到两种解决方案: 对于每个表单,覆盖表单,然后隐藏表单,而不是实际关闭它。 我真的不喜欢这个主意。 我觉得我每次都要关闭表单,然后从一个新的/新的表单开始。 使用短暂的生活方式注册表单而不是单身。 在这种情况下,容器真的只是作为工厂。 我遇到两个问题:a)我失去了通过容器跟踪表单的能力,并且,b)容器在validation期间抛出exception,说一次性类型不应该被注册为瞬态(我不明白为什么这是)。 这些问题都适用于我同时需要多个实例的表单。 我可以通过在validation期间抑制诊断警告来解决问题b)。 registration = container.GetRegistration(typeof(ILoginView)).Registration; registration.SuppressDiagnosticWarning(DiagnosticType.DisposableTransientComponent, “Winforms registration supression.”); 在这里采取正确的方法是什么? 我错过了什么吗?

如何使用unity + UnityAutoRegistration打开通用装饰器链接

在阅读了关于命令处理程序装饰的这篇文章之后,今天在一个有趣的切线上走了。 我想看看我是否可以使用Unity而不是SimpleInjector来实现模式,到目前为止它certificate是非常困难的。 我要做的第一件事是安装UnityAutoRegistration来解析开放的通用ICommandHandler接口。 该方面的当前解决方案如下: Container = new UnityContainer().LoadConfiguration(); Container.ConfigureAutoRegistration() .ExcludeSystemAssemblies() .Include(type => type.ImplementsOpenGeneric(typeof(ICommandHandler)), (t, c) => c.RegisterType(typeof(ICommandHandler), t) ) .ApplyAutoRegistration() ; 这适用于第一部分,解决任何单个 ICommandHandler 。 到目前为止,令人沮丧的是实施装饰处理程序。 一旦我添加第二个ICommandHandler作为装饰器,Unity就会抛出StackOverflowException。 我不太了解Unity内部,但我猜这是因为它无法确定要解析的实例 – 命令处理程序或命令处理程序装饰器 – 因为它们都实现了ICommandHandler接口。 谷歌搜索引导我首先阅读这篇文章 ,它解释了如何在我认为的蛮力方法中做到这一点。 我也找到了这些 相关的 页面,但没有一个是我问题的完整解决方案(我太无知了,不能自己解决)。 然后我找到了这篇文章,这似乎解决了我同样的担忧 。 然而,强大的解决方案并不能解决开放式generics问题。 目前,我们的大多数依赖项都是从.config文件中的unity部分加载的,所以我不想为每个处理程序或装饰器编写大量的编译代码。 似乎有某种UnityContainerExtension和DecoratorBuildStrategy是正确的方法,但我无法弄明白。 我现在已经玩了一段时间的powershell代码了,而且完全卡住了。 我尝试修改他的代码以考虑generics导致BadImageFormatExceptions(尝试加载具有不正确格式的程序。(HRESULT的exception:0x8007000B))。 我喜欢这样做以实现装饰器链接的想法,因为它很短,每个关注点只有1行: var container = new Container(); // Go look in all assemblies […]

带有DI Simple Injector的log4net

我正在尝试使用Simple Injector(+ integration MVC)v 2.5.2。 对于MVC 4应用程序,我也需要跟踪/记录性能(执行)(通过log4net模块)。 当前实现(在运行时)在指定的路径中创建log4net文件,但没有写入任何文本行(当我调试它时,一切都没有错误到_logger.Info(“message”)的结尾)。 有没有人尝试使用Simple Injector DI for log4net? 我注册log4net模块的方式是: public static class LoggingModule { public static void RegisterServices(Container container) { string log4NetConfigFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, “log4net.config”); log4net.Config.XmlConfigurator.ConfigureAndWatch(new FileInfo(log4NetConfigFile)); var logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); container.RegisterSingle(logger); } } 并在Global.asax LoggingModule.RegisterServices(container); Log4net配置文件看起来像这样(我不认为有任何问题): 并打开/关闭我一直在使用的日志记录: private static void RegisterIPerformanceStatisticLogger(Container container) { if (ShouldLogPerformance()) { container.Register(WebLifestyle); } else […]

使用简单注入器的每线程和每Web请求的混合生活方式

我使用SimpleInjector作为我的IoC库。 我根据网络请求注册DbContext ,它工作正常。 但是我有一个任务是在后台线程中运行它。 所以,我有一个问题是创建DbContext实例。 例如 Service1有一个DbContext实例 DbContext有一个DbContext实例 Service1和Service2从后台线程运行。 Service1获取实体并将其传递给Service2 Service2使用该实体,但实体与DbContext分离 实际上问题在于: Service1.DbContext与Service2.DbContext不同。 看来,当我在ASP.NET MVC中的一个单独的线程中运行一个任务时, DbContext为每个调用创建一个新的DbContext实例。 虽然一些IoC库(例如StructureMap )对于每个SimpleInjector -per-webrequest具有混合生活方式,但似乎SimpleInjector没有一个。 我对吗? 你有任何想法在SimpleInjector解决这个问题吗? 提前致谢。 编辑: 我的服务在这里: class Service1 : IService1 { public Service1(MyDbContext context) { } } class Service2 : IService2 { public Service2(MyDbContext context, IService1 service1) { } } class SyncServiceUsage { public SyncServiceUsage(Service2 service2) { […]

使用SimpleInjector和SignalR

我认为使用我自己的IoC对SignalR非常简单,也许是; 我很可能做错了什么。 这是我到目前为止的代码: private static void InitializeContainer(Container container) { container.Register<IMongoHelper, MongoHelper>(); // … registrations like about and then: var resolver = new SimpleInjectorResolver(container); GlobalHost.DependencyResolver = resolver; } 然后我的class级: public class SimpleInjectorResolver : DefaultDependencyResolver { private Container _container; public SimpleInjectorResolver(Container container) { _container = container; } public override object GetService(Type serviceType) { return _container.GetInstance(serviceType) ?? base.GetService(serviceType); […]

在Windows窗体中使用带有工作单元和存储库模式的简单注入器

我正在尝试在我的Windows窗体应用程序中实现IoC。 我的选择落在Simple Injector上,因为它快速而轻巧。 我还在我的应用程序中实现了工作单元和存储库模式。 这是结构: DbContext : public class MemberContext : DbContext { public MemberContext() : base(“Name=MemberContext”) { } public DbSet Members { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Conventions.Remove();\ } } 型号 : public class Member { public int MemberID { get; set; } public string Name { get; set; […]

使用Simple Injector注册IAuthenticationManager

我正在为Simple Injector配置设置,我将所有注册都移到了OWIN管道。 现在问题是我有一个控制器AccountController实际上将参数作为 public AccountController( AngularAppUserManager userManager, AngularAppSignInManager signinManager, IAuthenticationManager authenticationManager) { this._userManager = userManager; this._signInManager = signinManager; this._authenticationManager = authenticationManager; } 现在,我的Owin Pipeline配置看起来像这样 public void Configure(IAppBuilder app) { _container = new Container(); ConfigureOwinSecurity(app); ConfigureWebApi(app); ConfigureSimpleinjector(_container); app.Use(async (context, next) => { _container.Register(() => context); await next(); }); _container.Register( () => _container.GetInstance().Authentication); _container.Register<SignInManager, AngularAppSignInManager>(); } private […]