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

33

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

container.RegisterType<IAuthoringRepository, AuthoringRepository>();

我想配置Unity使用一个工厂方法,并将Windows身份验证作为参数传递(例如:RepositoryFactory.CreateAuthoringRepository(WindowsIdentity.GetCurrent())),以便在解析IAuthoringRepository类型时使用。我该怎么做?

2个回答

52
一种方法是使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 - 解析模型
debug - 调用工厂
使用 System.Security.Principal.WindowsIdentity 的存储库标识构建模型

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


如何将其集成到asp.net mvc应用程序中?https://stackoverflow.com/questions/50043786/cannot-convert-lambda-expression-to-type-injectionmember-because-it-is-not-a?noredirect=1#comment87104469_50043786 - kudlatiger

3

现在,方法InjectionFactory已经过时。因此最好使用RegisterFactory方法。下面我将展示先前的代码如何更改。您可以看到我如何更改CreateAuthoringRepository方法。现在它是一个带有一个参数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; }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接