Questions tagged «dependency-injection»

通过动态地将其需要起作用的依赖项注入软件组件来减少组件之间的耦合的设计模式。

2
为什么不使用IoC容器来解析实体/业务对象的依赖关系?
我了解DI背后的概念,但我只是在学习不同的IoC容器可以做什么。似乎大多数人主张使用IoC容器来连接无状态服务,但是将它们用于诸如实体之类的有状态对象又如何呢? 无论是对还是错,我通常都会用行为来填充我的实体,即使该行为需要外部类。例: public class Order : IOrder { private string _ShipAddress; private IShipQuoter _ShipQuoter; public Order(IOrderData OrderData, IShipQuoter ShipQuoter) { // OrderData comes from a repository and has the data needed // to construct order _ShipAddress = OrderData.ShipAddress; // etc. _ShipQuoter = ShipQuoter; } private decimal GetShippingRate() { return _ShipQuoter.GetRate(this); …

8
将记录器作为单例是一个好习惯吗?
我习惯将记录器传递给构造函数,例如: public class OrderService : IOrderService { public OrderService(ILogger logger) { } } 但这很烦人,因此我已经将它用作属性一段时间了: private ILogger logger = NullLogger.Instance; public ILogger Logger { get { return logger; } set { logger = value; } } 这也很烦人-它并不干燥,我需要在每节课中重复。我可以使用基类,但是再说一次-我使用的是Form类,因此需要FormBase等。所以我认为,暴露ILogger的单例将带来什么负面影响,所以一个人就会知道在哪里获取记录器: Infrastructure.Logger.Info("blabla"); 更新:正如Merlyn正确注意到的那样,我应该提到,在第一和第二个示例中,我正在使用DI。

3
将依赖项注入ASP.NET MVC 3操作筛选器。这种方法有什么问题?
这是设置。假设我有一些需要服务实例的动作过滤器: public interface IMyService { void DoSomething(); } public class MyService : IMyService { public void DoSomething(){} } 然后,我有一个需要该服务实例的ActionFilter: public class MyActionFilter : ActionFilterAttribute { private IMyService _myService; // <--- How do we get this injected public override void OnActionExecuting(ActionExecutingContext filterContext) { _myService.DoSomething(); base.OnActionExecuting(filterContext); } } 在MVC 1/2中,将依赖项注入到动作过滤器中有点麻烦。最常见的方法是使用自定义操作调用因为在这里可以看到:http://www.jeremyskinner.co.uk/2008/11/08/dependency-injection-with-aspnet-mvc-action-filters/的此替代方法的主要动机是因为以下方法被认为与容器不牢固且紧密耦合: public class …

4
如何将Log4net与依赖注入一起使用
我试图找出依赖注入框架对log4net的正确模式和用法。 Log4Net使用ILog界面,但需要我打电话 LogManager.GetLogger(Reflection.MethodBase.GetCurrentMethod().DeclaringType) 在每个需要记录信息的类或方法中。这似乎违反了IoC原则,使我不得不使用Log4Net。 我应该以某种方式在某处放置另一层抽象吗? 另外,我需要这样记录自定义属性,例如当前用户名: log4net.ThreadContext.Properties["userName"] = ApplicationCache.CurrentUserName; 我如何封装它,这样我就不必记住每次都要做,而仍然保持当前正在记录的方法。我应该做这样的事情还是我完全错过了分数? public static class Logger { public static void LogException(Type declaringType, string message, Exception ex) { log4net.ThreadContext.Properties["userName"] = ApplicationCache.CurrentUserName; ILog log = LogManager.GetLogger(declaringType); log.Error(message, ex); } }

4
“控制反转”,“依赖反转”和“解耦”之间的区别
我正在阅读有关依赖倒置和解耦的理论,但看不到两者之间的区别。 依赖倒置讨论了将功能组件去耦的问题,以便更高级别的组件不依赖于更低级别的组件。 去耦讨论了同一件事以及如何实现。但是随后我们有了IoC容器,使事情变得更加混乱。为什么它们不叫Dependency Inversion Containers或更好的Dependency Injection Containers,因为它们为独立组件的运行时耦合提供服务? 然后我们有控制反转。这和依赖倒置基本上是一样的,不是吗?为什么有三个描述同一事物的术语?还是我瞎了? 两者之间有什么区别? IoC在IoC容器中必须做什么?

5
如何在Symfony中将存储库注入服务?
我需要将两个对象注入ImageService。其中一个是的实例Repository/ImageRepository,我得到这样的信息: $image_repository = $container->get('doctrine.odm.mongodb') ->getRepository('MycompanyMainBundle:Image'); 那么如何在我的services.yml中声明呢?这是服务: namespace Mycompany\MainBundle\Service\Image; use Doctrine\ODM\MongoDB\DocumentRepository; class ImageManager { private $manipulator; private $repository; public function __construct(ImageManipulatorInterface $manipulator, DocumentRepository $repository) { $this->manipulator = $manipulator; $this->repository = $repository; } public function findAll() { return $this->repository->findAll(); } public function createThumbnail(ImageInterface $image) { return $this->manipulator->resize($image->source(), 300, 200); } }

6
@Bean和@Autowired之间的区别
为什么@Autowired在这种情况下不能使用? @SpringBootApplication public class Application { @Autowired BookingService bookingService; public static void main(String[] args) { bookingService.book("Alice", "Bob", "Carol"); } } 但可以使用 @Bean @SpringBootApplication public class Application { @Bean BookingService bookingService() { return new BookingService(); } public static void main(String[] args) { ApplicationContext ctx = SpringApplication.run(Application.class, args); BookingService bookingService = ctx.getBean(BookingService.class); …

5
如何使用构造函数依赖项注入对asp.net核心应用程序进行单元测试
我有一个使用应用程序的startup.cs类中定义的依赖项注入的asp.net核心应用程序: public void ConfigureServices(IServiceCollection services) { services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration["Data:FotballConnection:DefaultConnection"])); // Repositories services.AddScoped<IUserRepository, UserRepository>(); services.AddScoped<IUserRoleRepository, UserRoleRepository>(); services.AddScoped<IRoleRepository, RoleRepository>(); services.AddScoped<ILoggingRepository, LoggingRepository>(); // Services services.AddScoped<IMembershipService, MembershipService>(); services.AddScoped<IEncryptionService, EncryptionService>(); // new repos services.AddScoped<IMatchService, MatchService>(); services.AddScoped<IMatchRepository, MatchRepository>(); services.AddScoped<IMatchBetRepository, MatchBetRepository>(); services.AddScoped<ITeamRepository, TeamRepository>(); services.AddScoped<IFootballAPI, FootballAPIService>(); 这允许这样的事情: [Route("api/[controller]")] public class MatchController : AuthorizedController { private readonly IMatchService _matchService; …



5
依赖注入和命名记录器
我有兴趣了解有关人们如何使用依赖项注入平台注入日志的更多信息。尽管下面的链接和我的示例引用了log4net和Unity,但我不一定要使用这两个。对于依赖项注入/ IOC,我可能会使用MEF,因为这是其余项目(大型)正在建立的标准。 我对依赖关系注入/ ioc非常陌生,对C#和.NET也很陌生(在VC6和VB6大约十年后,在C#/。NET中很少编写生产代码)。我对现有的各种日志记录解决方案进行了很多调查,因此我认为我对它们的功能集有很好的了解。我只是对注入一个依赖项的实际机制还不够熟悉(或者,也许更“正确”地,是获取一个依赖项的抽象版本)。 我看过其他与日志记录和/或依赖注入相关的帖子,例如: 依赖注入和日志记录接口 记录最佳做法 Log4Net Wrapper类是什么样的? 再次关于log4net和Unity IOC配置 我的问题与“如何使用IOC工具yyy注入xxx日志记录平台”无关。而是,我对人们如何处理包装日志记录平台(通常但不总是建议)和配置(即app.config)感兴趣。例如,以log4net为例,我可以配置(在app.config中)许多记录器,然后以使用如下代码的标准方式获取这些记录器(不依赖注入): private static readonly ILog logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 另外,如果我的记录器不是以类命名,而是以功能区域命名,则可以这样做: private static readonly ILog logger = LogManager.GetLogger("Login"); private static readonly ILog logger = LogManager.GetLogger("Query"); private static readonly ILog logger = LogManager.GetLogger("Report"); 因此,我想我的“要求”将是这样的: 我想将我的产品的来源与对日志记录平台的直接依赖相隔离。 我希望能够通过某种依赖注入(可能是MEF)直接或间接解析特定的命名记录器实例(可能在同一命名实例的所有请求者之间共享同一实例)。 我不知道这是否很难,但是我希望能够按需获取命名记录器(与类记录器不同)。例如,我可能会基于类名称为我的类创建一个记录器,但是一种方法需要特别繁重的诊断,而我想单独进行控制。换句话说,我可能希望单个类“依赖”两个单独的记录器实例。 让我们从数字1开始。我已经阅读了很多文章,主要是关于stackoverflow的,关于包装是否是个好主意。请参阅上面的“最佳实践”链接,并转到jeffrey hantin的注释中,以获取有关包装log4net的原因的观点。如果您进行了包裹(如果可以有效包裹),您是否将包裹严格地用于注射/去除直接依赖?还是您还会尝试抽象出部分或全部log4net app.config信息? 假设我要使用System.Diagnostics,可能要实现一个基于接口的记录器(甚至使用“通用的” ILogger …

1
Spring在没有@Autowired注解的情况下将依赖项注入构造函数中
我正在尝试这个官方Spring教程中的示例,并且对此代码有依赖性:https : //github.com/spring-guides/gs-async-method/tree/master/complete 如果您看一下AppRunner.java 课堂上的代码,我有两个问题: 服务器启动时,如果我在此类的构造函数中放置一个断点,则看起来像在构造函数中,GitHubLookupService是由spring提供的,使用@Service配置bean。但是,@Autowired构造函数上没有注释,那么在世界上该构造函数如何以正确的依赖关系进行调用?应该是null。 这是Spring Boot的自动假设吗? Spring是否看到“私有字段+构造函数参数”,并且假定它应该寻找合适的bean? 是Spring Framework还是Spring boot? 我缺少什么了吗? 如我所记得,必须为bean /服务等提供默认构造函数。为什么此类(AppRunner)没有默认构造函数?Spring如何知道应该使用参数运行构造函数?是因为它是唯一的构造函数吗?

5
在独立的Java应用程序中使用Spring 3 autowire
这是我的代码: public class Main { public static void main(String[] args) { Main p = new Main(); p.start(args); } @Autowired private MyBean myBean; private void start(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("META-INF/config.xml"); System.out.println("my beans method: " + myBean.getStr()); } } @Service public class MyBean { public String getStr() { return …



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.