如何使用静态工厂方法创建对象?
问题描述:
我知道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。
谢谢!像魅力一样工作=) – burnt1ce
完美!这也适用于我。 –