c# - 带有参数的Unity自动工厂

标签 c# unity-container

我正在尝试找出注入(inject)带参数的自动工厂的正确方法,或者即使这可以通过 Unity 实现。

例如我知道我可以这样做:

public class TestLog
{
     private Func<ILog> logFactory;

     public TestLog(Func<ILog> logFactory)
     {
          this.logFactory = logFactory;
     }
     public ILog CreateLog()
     {
         return logFactory();
     }
}

Container.RegisterType<ILog, Log>();
TestLog test = Container.Resolve<TestLog>();
ILog log = test.CreateLog();

现在我希望能够做的是:

public class TestLog
{
     private Func<string, ILog> logFactory;

     public TestLog(Func<string, ILog> logFactory)
     {
          this.logFactory = logFactory;
     }
     public ILog CreateLog(string name)
     {
         return logFactory(name);
     }
}

Container.RegisterType<ILog, Log>();
TestLog test = Container.Resolve<TestLog>();
ILog log = test.CreateLog("Test Name");

不幸的是,这不起作用。我知道如何在 Unity 中设置自定义工厂来创建实例,只是似乎无法为此示例提供任何清晰的示例。

显然我可以创建自己的工厂,但我正在寻找一种优雅的方式在 Unity 中使用最少的代码来做到这一点。

最佳答案

很抱歉成为那些回答自己问题的烦人的人之一,但我想通了。

public class TestLog
{
    private Func<string, ILog> logFactory;

    public TestLog(Func<string, ILog> logFactory)
    {
         this.logFactory = logFactory;
    }
    public ILog CreateLog(string name)
    {
        return logFactory(name);
    }
}

Container.RegisterType<Func<string, ILog>>(
     new InjectionFactory(c => 
        new Func<string, ILog>(name => new Log(name))
     ));

TestLog test = Container.Resolve<TestLog>();
ILog log = test.CreateLog("Test Name");

关于c# - 带有参数的Unity自动工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3825270/

相关文章:

c# - 在 Vb6 和 C# 中,我如何拥有多个字符串

wpf - WPF + Unity : UserControl with usage of services?

c# - ASP.NET Core - 无法在 Controller 内使用 C# StreamReader 读取静态 HTML 文件

c# - Linux上的Web服务

c# - 如何创建不比较两个单独继承类的抽象基类 IComparable?

.net - 使用 Unity IoC 容器时 VS 2015 建模项目 MSB3268 警告

c# - 在 Unity 中使用抽象工厂作为注入(inject)工厂?

c# - 当符号共享相同的名称时,如何告诉 C# 编译器符号是类型而不是变量?

c# - 是否可以将命名和未命名的统一注册解析为同一实例(ContainerControlled)

c# - Assembly.CreateInstance 解析 IoC Container