工厂和抽象工厂模式之间的基本区别是什么?
我试图让Unity管理我的对象的创建,我希望有一些在运行时才知道的初始化参数:
目前,我能想到的方法是在接口上使用Init方法.
interface IMyIntf {
  void Initialize(string runTimeParam);
  string RunTimeParam { get; }
}
然后使用它(在Unity中)我会这样做:
var IMyIntf = unityContainer.Resolve<IMyIntf>();
IMyIntf.Initialize("somevalue");
在这种情况下,runTimeParamparam是在运行时根据用户输入确定的.这里的简单案例只返回值,runTimeParam但实际上参数将类似于文件名,初始化方法将对文件执行某些操作.
这会产生许多问题,即该Initialize方法在界面上可用并且可以多次调用.在实现中设置一个标志并在重复调用时抛出异常Initialize似乎很笨重.
在解析我的界面时,我不想知道有关实现的任何信息IMyIntf.但是,我想要的是知道这个接口需要一定的一次初始化参数.有没有办法以某种方式注释(属性?)具有此信息的接口,并在创建对象时将它们传递给框架?
编辑:更多地描述了界面.
interface-design dependency-injection ioc-container inversion-of-control unity-container
注意:问题在帖子的末尾.
我已经阅读了有关Abstract Factory vs Factory Method的其他stackoverflow线程.我理解每个模式的意图.但是,我不清楚这个定义.
Factory方法定义了一个用于创建对象的接口,但是让子类决定实例化哪些接口.工厂方法允许类将实例化延迟到子类.
相比之下,抽象工厂提供了一个接口,用于创建相关或从属对象的族,而无需指定其具体类.
该抽象工厂看起来非常相似的工厂方法.我已经绘制了一些UML类来说明我的观点.
注意:
工厂方法:

抽象工厂(仅1名成员):
抽象工厂(更多成员):

问题:
language-agnostic uml design-patterns factory-method abstract-factory
我决定在一个更大的项目中使用IoC原则.但是,我想得到的东西很长一段时间一直困扰着我.我得出的结论是IoC容器是一种架构模式,而不是一种设计模式.换句话说,没有类应该知道它的存在,并且应该在应用层使用容器本身来缝合所有组件.从本质上讲,它是一个精心设计的面向对象模型的选择.话虽如此,如何在不占用IoC容器的情况下访问已解析的类型(无论它们是否抽象)?我在这里看到的唯一选择是利用使用IoC容器来解析具体类型的抽象工厂.这应该很容易换掉一组标准工厂.这是一个好方法吗?有没有人在这里使用它以及它对你有用吗?还有别的吗?
谢谢!
假设我有一些类Foo,它有两个依赖:an ISerializer<T>和an IFileAccessHandler.
现在这个类还有其他依赖项,功能依赖项.我不希望任何人在无效状态下实例化这个类,所以我还需要在构造函数中传递一个域对象.
但是,当我实际创建类Foo的那一刻,当我也知道要传递哪个域对象时,如何处理IoC?
我使域对象成为我由Factory设置的属性.因此,Factory会调用Service Locator来获取一个正确实例化的"Foo"类及其依赖项,并进一步使用正确的域对象填充它并返回它.
但这是最好的方式吗?我宁愿让我的构造函数的域对象部分让它变得明确,你实际上需要使用"Foo".
有任何想法吗?我在这里错过了什么吗?
我熟悉这些模式,但仍然不知道如何处理以下情况:
public class CarFactory
{
     public CarFactory(Dep1,Dep2,Dep3,Dep4,Dep5,Dep6)
     {
     }
     public ICar CreateCar(type)
     {
            switch(type)
            {
               case A:
                   return new Car1(Dep1,Dep2,Dep3);
               break;
               case B:
                   return new Car2(Dep4,Dep5,Dep6);
               break;
            }
     }
}
通常,问题在于需要注入的引用量.当有更多的汽车时会更糟.
我想到的第一种方法是在工厂构造函数中注入Car1和Car2,但它违反工厂方法,因为工厂将始终返回相同的对象.第二种方法是注入servicelocator,但它的反模式到处都是.怎么解决?
替代方式1:
public class CarFactory
{
     public CarFactory(IContainer container)
     {
        _container = container;
     }
     public ICar CreateCar(type)
     {
            switch(type)
            {
               case A:
                   return _container.Resolve<ICar1>();
               break;
               case B:
                     return _container.Resolve<ICar2>();
               break;
            }
     }
}
替代方式2(由于树中的依赖性过多而难以使用):
public class CarFactory
{
     public CarFactory()
     {
     }
     public ICar CreateCar(type)
     {
            switch(type)
            { …c# dependency-injection inversion-of-control factory-pattern
我终于忍受了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 MaximumSpeed
    {
        get
        {
            return this.engine.MaxSpeed;
        }
    }
    public Car(IEngine engine)
    {
        this.engine = engine;
    }
}
我的问题如下:我应该如何实例化快车或慢车?我可以使用容器为我提供每个实现,我可以设置一个"默认"实现来使用:
IUnityContainer container = new UnityContainer();
container.RegisterType<IEngine, FastEngine>();
container.RegisterType<IEngine, FastEngine>("Fast"); …c# dependency-injection ioc-container unity-container strategy-pattern
我有这个wcf方法
Profile GetProfileInfo(string profileType, string profileName)
和业务规则:
如果profileType是从数据库中读取的"A".
如果profileType是从"xml"文件中读取的"B".
问题是:如何使用依赖注入容器实现它?
我有一个具有多个实现的接口(称为IAcmeService).
FileSystemAcmeService
DatabaseAcmeService
NetworkAcmeService
最终用户需要能够选择将使用哪种实现,并保存该选择.
目前我正在配置我的IOC容器(Unity)以使用名称注册所有已知的实现.
container.RegisterType(of IAcmeService, FileSystemAcmeService)("FileSystemAcmeService")
container.RegisterType(of IAcmeService, DatabaseAcmeService)("DatabaseAcmeService")
container.RegisterType(of IAcmeService, NetworkAcmeService)("NetworkAcmeService")
为了允许用户保存他们的选择,我有app.config配置部分文件,用于存储要使用的所选服务名称.
要解决所选的实现,我正在使用该服务的类的Initialize方法中进行手动解析.
Private _service as IAcmeService
Public Sub Initialize()
    _service = container.Resolve(of IAcmeService)(_config.AcmeServiceName)
End Sub
这似乎不对,因为我的班级必须知道容器.但我无法想出另一种方式.
是否有其他方法可以让最终用户选择而不让班级知道容器?