团结汽车工厂与params

The*_*ing 17 c# unity-container

我正在试图找出一个正确的方法来注入一个需要参数的自动工厂,或者即使这可以通过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();
Run Code Online (Sandbox Code Playgroud)

现在我希望能做的是:

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");
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不起作用.我可以看到你如何设置自定义工厂来在Unity中创建实例,似乎无法为这个例子提供任何明确的例子.

显然我可以创建自己的工厂,但我正在寻找一种优雅的方式在Unity中以最少的代码执行此操作.

The*_*ing 32

很抱歉成为那些讨厌回答自己问题的人之一,但我明白了.

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");
Run Code Online (Sandbox Code Playgroud)

  • 我没有找到"回答你自己的问题"是烦人的,特别是当它有用时:)你能解释一下这个`RegisterType <Func <string,ILog >>(新的InjectionFactory(..)`代码?它不是那个很明显......我知道它确保test.CreateLog("dsffads")得到解决,但是**怎么样?**,**为什么**? (4认同)

The*_*igB 7

@TheCodeKing的答案工作正常,但在大多数(可能全部?)案例中可以缩短为以下内容:

Container.RegisterInstance<Func<string, ILog>>(name => new Log(name));
Run Code Online (Sandbox Code Playgroud)

(注意我正在使用RegisterInstance()而不是RegisterType())

由于Func<>实施已经是一种工厂,通常不需要将其包装成InjectionFactory.它只能确保每个分辨率Func<string, ILog>都是一个新实例,我真的不能想到需要这个的场景.