1

首先,如果我对术语的使用是无效的,请尽量纠正但不确定它是否正确,但现在对我来说有点困惑。了解使用基于接口的工厂和普通IoC接口之间的差异instansiation

我正在使用温莎,并无法弄清楚什么时候以及如何(我认为)使用基于接口的工厂实例化,而不是总是正常的ctor(IObj obj)

让我举个例子。我有这样的构造

private ICache _cache; 
private ICache _cache2; 
public HomeController(ICacheFactory cacheFactory, ICache cache) 
{ 
    this._cache = cacheFactory.Create<ICacheFactory>(); 
    this._cache2 = cache; 
} 

我已经安装我的代码,_cache_cache2返回EXAKT同一对象的方式。为什么我应该使用教学课堂的方式?

这是我是如何配置它

public interface ICacheFactory 
{ 
    ICache Create<T>(); 
} 

public interface ICache 
{ 
    bool Get<T>(string key, out T exists); 
} 

public bool Get<T>(string key, out T result) 
    { 
     // my code 
    } 

public void Install(IWindsorContainer container, IConfigurationStore store) 
    { 
     container.Register(Classes.FromThisAssembly().BasedOn<IController>().LifestyleTransient()); 
     container.AddFacility<TypedFactoryFacility>(); 
     container.Register(Component.For<ICacheFactory>().AsFactory()); 

     container.Register(Component.For<ICache>().ImplementedBy<CacheFactory>().LifestyleTransient()); 
    } 

我想CacheFactory,当我做

public class CacheFactory : ICache 
{ 
    private static ICache cacheObject; 
    public static ICache Current 
    { 
     get 
     { 
      if (cacheObject == null) 
       cacheObject = new CacheFactory(); 

      return cacheObject; 
     } 
    } 

    public bool Get<T>(string key, out T result) 
    { 
     // my code 
    } 
} 

所以我在我想什么interface-based factories做的方式complety方式如果不是,我为什么要用类似于课堂的方式?

(我应该清楚,我读过温莎文档,但没有得到它100%。)

感谢您的时间,我希望这不是模糊。

回答

3

正确应用依赖注入时,您会发现这会显着减少您需要使用的工厂数量。工厂仍然是有用的,有时需要的,但它们的使用仅限于,你要么时代:

  1. 明确需要控制服务的生命周期(比如因为你需要的结束处置这样的实例方法)
  2. 当您需要通过推迟创建来分解对象图时。

在大多数情况下,不应使用工厂。特别是在你展示的情况下,工厂在构造函数中被调用。这是毫无用处的,因为:

  1. 您不会延迟构建对象图,因为在构造函数内调用工厂与在调用构造函数之前调用工厂具有相同的效果。
  2. 由于您的HomeController现在依赖于额外的抽象ICacheFactory,因此您的代码库很复杂,只需单独依赖ICache即可满足其需求。这也使测试变得复杂。为什么要求HomeController需要了解这家工厂?

此外,您指出“_cache和_cache2返回完全相同的对象”,因此不需要在此处注入两个缓存。所以,你的构造应该是这样的:

private ICache _cache; 
public HomeController(ICache cache) 
{ 
    this._cache = cache; 
} 

如果你的工厂中包含复杂的行为做了选择,你仍然可以使用您的作品的根里面,但有可能不是一个原因,应用程序代码采取的依赖在上面。

+0

我想听到的声音是“在大多数其他情况下,不应该用工厂。”,我希望来我就知道我什么时候需要使用的工厂,而不是逼我只是因为它是可以使用它们;) – Andreas 2014-10-29 20:31:02