Tag: simple injector

Simple Injector:在基类中注入属性

几周以来,我一直在使用Simple Injectordependency injection容器,取得了巨大的成功。 我喜欢简单的配置它。 但现在我有一个我不知道如何配置的设计。 我有一个基类,其中有许多类型派生,我想将dependency injection基类的属性,但不必为每个派生类配置。 我尝试使用属性执行此操作,但Simple Injector不支持属性。 这是我设计的精简版。 public interface Handler where TMessage : Message { void Handle(TMessage message); } public abstract class BaseHandler { // This property I want to inject public HandlerContext Context { get; set; } } // Derived type public class NotifyCustomerHandler : BaseHandler, Handler { public NotifyCustomerHandler(SomeDependency dependency) […]

简单的注入器从命名空间注册所有服务

我的服务接口具有Services.Interfaces的命名空间 Service Interfaces的实现具有Web.UI.Services的命名空间 例如,我有2个服务实现 需要注册到UserService的IUserService ICountryService需要注册到CountryService 这就是我目前使用SimpleInjector注册这些服务的方法。 container.Register (); container.Register (); 问题:如果我有超过100个服务夸大了一点。 我需要为每项服务添加一行。 如何使用Simple Injector将所有实现从一个程序集注册到所有接口形成另一个程序集?

防止Simple Injector在解析未注册的服务时抛出exception

我想知道,只要GetInstance(Of TService)返回Nothing Simple Injector是否可以选择停止抛出exception? 它现在似乎是抛出它们,因为我有两个请求来获取一个实例,它不在那里,它抛出了exception。 有没有办法防止默认行为,设置某个地方,或其他什么?

SimpleInjector和FluentValidationFactory

我正在尝试自动validation我的视图模型,我知道我可以添加一个属性来指定我的validation但是有一个选项可以设置工厂来自动化所有这些,我看着: 这个答案并提出来了这使用简单的注射器3.1: public class CustomValidatorFactory:ValidatorFactoryBase { private readonly Container siContainer; public CustomValidatorFactory(Container siContainer) { var assemblies = AppDomain.CurrentDomain.GetAssemblies().ToList(); this.siContainer = siContainer; this.siContainer.Register(typeof(IValidator), assemblies); } public override IValidator CreateInstance(Type validatorType) { //var instances = siContainer.GetAllInstances(validatorType); var implementation = ((IServiceProvider)siContainer).GetService(validatorType); var validatorInstance = implementation != null ? (implementation as IValidator) : null; return validatorInstance; } } 然后视图模型可以是这样的 […]

简单注入器:使用ILoggerFactory.CreateLogger注册ILogger ()

我正在使用一个利用Simple Injector作为dependency injection器的项目。 另一方面,该项目使用Microsoft.Extensions.Logging来记录某些类中发生的事件。 我的技术问题很容易解释。 我想在我的DI中注册ILogger独立于正在调用的类T,但是我需要从我的ILoggerFactory.CreateLogger()方法中执行它,因为它使用Microsoft.Extensions.Configuration获取记录器配置。 为了实现我的记录器,我需要使用这样的东西: private Microsoft.Extensions.Logging.ILogger CreateLogger() { var factory = this.ResolveService(); var logger = factory.CreateLogger(); return logger; } 我可以通过以下方式实现注射: Container.Register(typeof(ILogger), typeof(Logger)); 这使我们能够解决以下问题: public class SomeApiController : ApiController { public SomeApiController(ILogger logger) { //logger is well instantiated, but doesn’t got the configuration logger.LogInformation(“test log.”); } } 但正如我所说,这样做不会通过从Microsoft.Extensions.Logging.ILoggerFactory类获得的配置,所以这没用。 有没有办法使用我的CreateLogger注册ILogger CreateLogger ?

将Application Insights与unit testing结合使用?

我有一个MVC网络应用程序,我正在使用Simple Injector进行DI。 我的几乎所有代码都包含在unit testing中。 但是,现在我在某些控制器中添加了一些遥测调用,我在设置依赖项时遇到了麻烦。 遥测调用用于将指标发送到Microsoft Azure托管的Application Insights服务。 该应用程序未在Azure中运行,只是一个带有ISS的服务器。 AI门户网站会告诉您有关应用程序的各种信息,包括您使用遥测库发送的任何自定义事件。 因此,控制器需要一个Microsoft.ApplicationInsights.TelemetryClient实例,该实例没有接口,并且是一个带有2个构造函数的密封类。 我试着像这样注册它(混合生活方式与这个问题无关,我只是为了完整性而把它包括在内): // hybrid lifestyle that gives precedence to web api request scope var requestOrTransientLifestyle = Lifestyle.CreateHybrid( () => HttpContext.Current != null, new WebRequestLifestyle(), Lifestyle.Transient); container.Register(requestOrTransientLifestyle); 问题是,由于TelemetryClient有2个构造函数,SI抱怨并且validation失败。 我找到了一篇文章,展示了如何覆盖容器的构造函数解析行为,但这似乎相当复杂。 首先,我想备份并提出这个问题: 如果我没有让TelemetryClient成为一个注入的依赖项(只是在类中创建一个新的),那么在每次运行unit testing时是否会将遥测发送到Azure,从而产生大量错误数据? 或者,Application Insights足够聪明,知道它是在unit testing中运行,而不是发送数据? 对此问题的任何“见解”将不胜感激! 谢谢

Simple Injector:需要创建具有依赖项的类的工厂类

我有一个工厂类,可以创建几种不同类型的类。 工厂已在集装箱中注册。 在工厂内部创建类的建议方法是什么,因为它们也具有依赖性。 我显然希望避免对容器的依赖,但如果我新建这些类,那么他们将不会使用容器。 例如 public class MyFactory { public IMyWorker CreateInstance(WorkerType workerType) { if (workerType == WorkerType.A) return new WorkerA(dependency1, dependency2); return new WorkerB(dependency1); } } 所以问题是我从哪里获取这些依赖项。 一种选择可能是使它们成为工厂的依赖关系。 例如 public class MyFactory { private Dependency1 dependency1; private Dependency2 dependency2; public MyFactory(Dependency1 dependency1, Dependency2, dependency2) { this.dependency1 = dependency1; this.dependency2 = dependency2; } public IMyWorker […]

在Owin启动期间,Simple Injector无法为每个Web API请求注册类注入

我正在使用Owin,Web API,entity framework,ASP.NET身份创建API。 我使用Simple Injector作为我选择的DI框架。 在Owin启动过程中,我想用一些示例数据为我的数据库建立种子。 这是由实现IDatabaseInitializer的类处理的,它看起来像这样: public class MyDbInitializer : DropCreateDatabaseAlways { private readonly IUserManager _userManager; public MyDbInitializer(IUserManager userManager) { _userManager = userManager; } protected override void Seed(MyDataContext context) { SeedIdentities(); } private void SeedIdentities() { var user = new User { UserName = “someUsername”, Email = “some@email.com” }; _userManager.CreateAsync(user, “Password”); } IUserManager是ASP.NET Identiy […]

为通用接口配置装饰器,并使用Simple Injector中的非通用接口参数将所有实例注入构造函数

我一直在使用与这篇优秀文章中描述的模式非常相似的模式,将命令和查询作为对象。 我也使用SimpleInjector作为DI容器。 唯一显着的区别是,控制器对某些ICommandHandler采取显式依赖关系。我希望控制器依赖于一个对象(一个Dispatcher ),该对象将接受一个ICommand实例并解析该命令的正确处理程序。 这将减少构造函数需要采用的参数数量,并使整个事物更容易使用。 所以我的Dispatcher对象构造函数如下所示: public CommandAndQueryDispatcher(IEnumerable commandHandlers, IEnumerable queryHandlers) { } 我的CommandHandler接口如下所示: public interface ICommandHandler : ICommandHandler where TCommand : ICommand { void Execute(TCommand command, ICommandAndQueryDispatcher dispatcher); } public interface ICommandHandler { void Execute(object command, ICommandAndQueryDispatcher dispatcher); } 典型的命令处理程序如下所示: public abstract class CommandHandlerBase : ICommandHandler where TCommand : ICommand { public abstract void […]

使用RegisterInitializer连接事件处理程序

我有一个WCF服务,它使用Simple Injector进行dependency injection。 我想在容器引导程序中连接一些事件处理程序。 我创建了一个接口IStatusChangeNotification : public interface IStatusChangeNotification { event EventHandler JobStatusChange; } 我的CommandHandler实现了IStatusChangeNotification并且有两个事件处理程序类EmailNotification和MmrNotification ,每个类定义一个Notify()方法。 然后在我的引导代码中,我有以下内容: container.Register(); container.Register(); container.RegisterManyForOpenGeneric(typeof(ICommandHandler), Assembly.GetExecutingAssembly()); container.RegisterInitializer(scn => { scn.JobStatusChange += container.GetInstance().Notify; scn.JobStatusChange += container.GetInstance().Notify; }); 这有效,并收到通知。 我的问题是,这是否是连接事件处理程序的正确/最佳方法? 如何在请求结束时删除处理程序并且无法删除它们会导致内存泄漏?