【问题标题】:How to create objects using a static factory method?如何使用静态工厂方法创建对象?
【发布时间】:2011-09-27 23:26:43
【问题描述】:

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

container.RegisterType<IAuthoringRepository, AuthoringRepository>();

我想将 Unity 配置为在解析 IAuthoringRepository 类型时使用工厂方法,并将 windows 标识作为参数传递(即:RepositoryFactory.CreateAuthoringRepository(WindowsIdentity.GetCurrent()))。我该怎么做?

【问题讨论】:

    标签: c# unity-container


    【解决方案1】:

    一种方法是让 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; }
    }
    

    打印出来:

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

    这适用于 Unity 2.0。对于早期版本,请参阅StaticFactoryExtension

    【讨论】:

    【解决方案2】:

    现在方法 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; }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-17
      • 2011-06-04
      • 2011-12-12
      • 2012-05-13
      • 1970-01-01
      • 2014-09-24
      • 1970-01-01
      相关资源
      最近更新 更多