如何使用静态工厂方法创建对象?

如何使用静态工厂方法创建对象?

问题描述:

我知道Unity可以配置为使用类的构造函数来创建一个类的实例(如下所示),但那不是我想要的。如何使用静态工厂方法创建对象?

container.RegisterType<IAuthoringRepository, AuthoringRepository>(); 

我想统一配置为使用一个工厂方法与作为参数传递的Windows标识(即:RepositoryFactory.CreateAuthoringRepository(WindowsIdentity.GetCurrent()))解析式的IAuthoringRepository时。我该怎么做呢?

一种方法是让RepositoryFactory实现IRepositoryFactory,然后注册。解析类型可以获得工厂,然后调用其CreateAuthoringRepository方法。如果需要,您可以创建一个名为CreateAuthoringRepositoryForCurrentIdentity的重载,或者使用Unity注册工厂的IIdentity依赖关系。

我可能只是注入一个工厂,并保留CreateAuthoringRepository方法,然后让客户端通过WindowsIdentity.GetCurrent()。这样身份总是新鲜的,你可以嘲笑工厂进行测试。

或者,你可以用InjectionFactory指定一个委托:

void Main() 
{ 
    using (var container = new UnityContainer()) 
    { 
     container.RegisterType<IAuthoringRepository>(
      new InjectionFactory(c => CreateAuthoringRepository())); 

     Console.WriteLine("debug - resolving model"); 
     var model = container.Resolve<Model>(); 
    } 
} 

public IAuthoringRepository CreateAuthoringRepository() 
{ 
    Console.WriteLine("debug - calling factory"); 
    return new AuthoringRepository 
     { Identity = WindowsIdentity.GetCurrent() }; 
} 

public class Model 
{ 
    public Model(IAuthoringRepository repository) 
    { 
     Console.WriteLine(
      "Constructing model with repository identity of " 
      + repository.Identity); 
    } 
} 

public interface IAuthoringRepository 
{ 
    IIdentity Identity { get; } 
} 

public class AuthoringRepository : IAuthoringRepository 
{ 
    public IIdentity Identity { get; set; } 
} 

此打印:

debug - resolving model 
debug - calling factory 
Constructing model with repository identity of System.Security.Principal.WindowsIdentity

这对统一2.0。使用较早的版本,请参阅StaticFactoryExtension

+1

谢谢!像魅力一样工作=) – burnt1ce

+1

完美!这也适用于我。 –