Tag: dependency injection

StructureMap通过注入而不是服务位置来解析依赖性

在我的项目中,我使用汇编扫描程序注册了许多ISerializers实现。 FWIW这是注册我的ISerializers的代码 Scan(scanner => { scanner.AssemblyContainingType(); scanner.AddAllTypesOf().NameBy(type => type.Name); scanner.WithDefaultConventions(); }); 然后正确注册 ISerializer (…ISerializer) Scoped as: Transient JsonSerializer Configured Instance of …JsonSerializer BsonSerializer Configured Instance of …BsonSerializer 等等。 目前,我能够弄清楚如何解决我想要的串行器的唯一方法是使用硬编码服务位置调用 jsonSerializer = ObjectFactory.GetNamedInstance(“JsonSerializer”); 现在我在class上知道我特别想要jsonSerializer,所以有没有办法配置一个规则或类似的东西,说ISerializer根据属性名连接命名实例? 所以我可以 MySomeClass(ISerializer jsonSerializer, ….) StructureMap正确解决了这种情况? 或者我正在接近这个错误,也许我应该只注册实现ISerializer的具体类型,然后专门使用 MySomeClass(JsonSerializer jsonSerializer, ….) 对于具体类的这些方面的东西?

简单注入器:使用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 ?

基类中的构造函数dependency injection

我正在使用Entity Framework构建存储库基类,其中所有实体存储库都将inheritance。 我想使用Ninject使用dependency injection在基类中注入DatabaseContext 。 我认为构造函数注入是正确的方法,但在派生类I中使用构造函数注入执行此操作必须将参数传递给基类中的构造函数,我不想要它。 因此,Setter Injection更合适吗? 这是我的代码: public abstract class BaseRepository : IDisposable where TEntity : class { private readonly DatabaseContext _databaseContext; protected BaseRepository(DatabaseContext databaseContext) { this._databaseContext = databaseContext; } } 在上面的例子中使用构造函数注入, 在我的派生类中,我必须将databaseContext对象传递给基类,我不喜欢对我的所有派生类执行此操作 : public class UsuarioRepository : BaseRepository, IUsuarioRepository { public UsuarioRepository(DatabaseContext databaseContext) : base(databaseContext) { } } Setter Injection而不是Constructor Injection是解决这个问题的好方法吗? 什么是最好的方法? […]

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 […]

使用IoC时,unit testing的策略应该是什么?

毕竟我读过有关dependency injection和IoC的内容我已经决定尝试在我们的应用程序中使用Windsor Container(它是一个50K LOC多层Web应用程序,所以我希望它不是一个矫枉过正)。 我已经使用了一个简单的静态类来包装容器,并在启动应用程序时对其进行初始化,这对于现在来说非常好。 我的问题是关于unit testing。 我知道通过让我可以将类协作者的存根/模拟实现注入到被测试的类中,DI将使我的生活变得更加轻松。 我已经使用这种技术编写了几个测试,这似乎对我有意义。 我不确定的是我是否应该在unit testing中使用IoC(在本例中为Windsor Castle)(可能以某种方式将其配置为针对我的特殊情况返回存根/模拟)或者是否更好地连接所有依赖项在测试中手动。 你怎么想,什么做法对你有用?

Ninject WithConstructorArgument:没有匹配的绑定可用,并且该类型不可自绑定

我对WithConstructorArgument的理解可能是错误的,因为以下内容不起作用: 我有一个服务,让我们称之为MyService,其构造函数采用多个对象,以及一个名为testEmail的字符串参数。 对于此字符串参数,我添加了以下Ninject绑定: string testEmail = “test@example.com”; kernel.Bind().To().WithConstructorArgument(“testEmail”, testEmail); 但是,在执行以下代码行时,我得到一个exception: var myService = kernel.Get(); 这是我得到的例外: 激活字符串时出错没有匹配的绑定可用,并且该类型不可自我绑定。 激活路径: 2)将依赖字符串注入到MyService类型的构造函数的参数testEmail中 1)请求MyService 建议: 1)确保已为字符串定义了绑定。 2)如果在模块中定义了绑定,请确保已将模块加载到内核中。 3)确保您没有意外创建多个内核。 4)如果使用构造函数参数,请确保参数名称与构造函数参数名称匹配。 5)如果使用自动模块加载,请确保搜索路径和filter正确无误。 我在这做错了什么? 更新 : 这是MyService构造函数: [Ninject.Inject] public MyService(IMyRepository myRepository, IMyEventService myEventService, IUnitOfWork unitOfWork, ILoggingService log, IEmailService emailService, IConfigurationManager config, HttpContextBase httpContext, string testEmail) { this.myRepository = myRepository; this.myEventService = myEventService; this.unitOfWork […]

unit testing返回void的方法

想要unit testing以下类中的方法 public class DeviceAuthorisationService : IDeviceAuthorisationService { private DeviceDetailsDTO deviceDetailsDTO = null; private IDeviceAuthorisationRepositiory deviceAuthorisationRepositiory; public DeviceAuthorisationService(IDeviceAuthorisationRepositioryService paramDeviceAuthorisationRepository) { deviceAuthorisationRepositiory = paramDeviceAuthorisationRepository; } public void AuthoriseDeviceProfile(long paramUserID, string paramClientMakeModel) { if (deviceDetailsDTO == null) GetCellPhoneDetails(userID); if (deviceDetailsDTO.IsDeviceSelected == false) throw new SomeCustomExceptionA(); if (deviceDetailsDTO.CellPhoneMakeModel.ToLower() != paramClientMakeModel.ToLower()) throw new SomeCustomExceptionB; } public void UpdateDeviceStatusToActive(long userID) […]

在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 […]

如何配置unity容器来提供字符串构造函数值?

这是我dad课 public class Dad { public string Name { get;set; } public Dad(string name) { Name = name; } } 这是我的测试方法 public void TestDad() { UnityContainer DadContainer= new UnityContainer(); Dad newdad = DadContainer.Resolve(); newdad.Name = “chris”; Assert.AreEqual(newdad.Name,”chris”); } 这是我得到的错误 “InvalidOperationException – the type String cannot be constructed. You must configure the container to supply this […]

记录为装饰器与dependency injection – 如果我需要在类中登录,该怎么办?

(我最初在这篇评论中提到了这个问题,但Mark Seemann要求我创建一个新问题。) 我正在开始一个新的应用程序(.NET Core,如果这很重要),现在我正在尝试决定如何准确地进行日志记录。 普遍的共识似乎是日志记录是一个跨领域的问题,因此记录器不应该直接注入应该记录的类。 通常,有一个例如下面的类如何不这样做: public class BadExample : IExample { private readonly ILogger logger; public BadExample(ILogger logger) { this.logger = logger; } public void DoStuff() { try { // do the important stuff here } catch (Exception e) { this.logger.Error(e.ToString()); } } } 相反,具有业务逻辑的类不应该知道记录器( SRP ),并且应该有一个单独的类来执行日志记录: public class BetterExample : IExample { public […]