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

本文关键字:方法 创建对象 工厂 静态 何使用 | 更新日期: 2023-09-27 18:09:46

我知道Unity可以配置为使用类的构造函数来创建类的实例(如下所示),但这不是我想要的。

container.RegisterType<IAuthoringRepository, AuthoringRepository>();

我想配置Unity使用一个工厂方法与windows身份传递作为参数(即:RepositoryFactory.CreateAuthoringRepository(WindowsIdentity.GetCurrent()))当解析IAuthoringRepository类型。我该怎么做呢?

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

一种方法是让RepositoryFactory实现IRepositoryFactory,然后注册它。已解决的类型可以获得一个工厂,然后调用它的CreateAuthoringRepository方法。如果需要的话,你可以创建一个名为CreateAuthoringRepositoryForCurrentIdentity的重载,或者在Unity中注册一个工厂的IIdentity依赖项。

我可能只是注入一个工厂,并离开CreateAuthoringRepository方法,因为你有它,然后让客户端通过windowidentity . 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; }
}
这个打印

:

调试解析模型调试-调用工厂使用System.Security.Principal.WindowsIdentity
的存储库标识构建模型

这是Unity 2.0的。对于早期版本,请参阅StaticFactoryExtension。

现在InjectionFactory方法已经过时了。这就是为什么最好使用方法RegisterFactory。下面我将展示前面的代码是如何更改的。我改变了方法CreateAuthoringRepository。现在它是带有一个参数的static方法IUnityContainer container

void Main()
{
    using (var container = new UnityContainer())
    {
        container.RegisterFactory<IAuthoringRepository>(CreateAuthoringRepository);
        Console.WriteLine("debug - resolving model");
        var model = container.Resolve<Model>();
    }
}
public static IAuthoringRepository CreateAuthoringRepository(IUnityContainer container)
{
    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; }
}