Tag: ioc container

dependency injection与策略模式

关于这个话题的讨论很多,但每个人似乎都错过了一个明显的答案。 我想帮助审查这个“明显的”IOC容器解决方案。 各种对话假设运行时选择策略和使用IOC容器。 我将继续这些假设。 我还想补充一个假设,即它不是必须选择的单一策略。 相反,我可能需要检索一个对象图,该对象图在整个图的节点中找到了几个策略。 我将首先快速概述两个常用的解决方案,然后我将展示我希望看到IOC容器支持的“明显”替代方案。 我将使用Unity作为示例语法,但我的问题不是Unity特有的。 命名绑定 这种方法要求每个新策略都手动添加绑定: Container.RegisterType(); Container.RegisterType(“Alpha”); Container.RegisterType(“Beta”); ……然后明确要求正确的策略: var strategy = Container.Resolve(“Alpha”); 优点:简单,并得到所有IOC容器的支持 缺点: 通常将调用者绑定到IOC容器,当然要求调用者知道有关策略的信息(例如名称“Alpha”)。 必须手动将每个新策略添加到绑定列表中。 此方法不适合处理对象图中的多个策略。 简而言之,它不符合要求。 抽象工厂 为了说明这种方法,假设以下类: public class DataAccessFactory{ public IDataAccess Create(string strategy){ return //insert appropriate creation logic here. } public IDataAccess Create(){ return //Choose strategy through ambient context, such as thread-local-storage. } } public […]

使用Unity的策略模式和dependency injection

我终于忍受了Dependency Injection(早就应该); 我开始玩Unity并遇到战略模式的问题。 我可以使用容器向我返回基于名称的策略的特定实现,但我没有看到我应该如何在上下文中获得正确的策略。 让我们举一个简单的例子说明:上下文是一辆汽车,它有一个IEngine(战略),有2个实现,FastEngine和SlowEngine。 代码将沿着这些方向看: public interface IEngine { double MaxSpeed { get; } } internal class FastEngine:IEngine { public double MaxSpeed { get { return 100d; } } } internal class SlowEngine:IEngine { public double MaxSpeed { get { return 10d; } } } public class Car { private IEngine engine; public double […]