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

标签 c# unity-container

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

container.RegisterType<IAuthoringRepository, AuthoringRepository>();

我想将 Unity 配置为在解析 IAuthoringRepository。我该怎么做?

最佳答案

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

我可能只是注入(inject)一个工厂并保留您拥有的 CreateAuthoringRepository 方法,然后让客户端传递 WindowsIdentity.GetCurrent()。这样身份总是新鲜的,你可以模拟工厂进行测试。

或者,您可以使用 InjectionFactory 指定委托(delegate):

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

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

关于c# - 如何使用静态工厂方法创建对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7576761/

相关文章:

c# - 将数组解包到方法参数中

unity-container - 自动映射并请求特定资源

c# - 微软团结 : Resolve auto-registered types

c# - Unity 中的单例模式与容器控制的 LifeTImeManager

c# - 重用方法参数

c# - 在 lambda 表达式 C# 中动态生成双引号字符串

c# - 以编程方式更改 WPF 可编辑组合框的背景颜色

c# - ASP.NET Web 控件中的 Html 编码

c# - 带有 Unity 的 Prism 6 - 在没有命名约定的情况下解析 View 的 View 模型

c# - Unity 无法加载文件或程序集 'Microsoft.Practices.ServiceLocation,版本 = 1.2.0.0