2010-09-29 41 views
13

我想找出正确的方法来注入一个自动工厂,它需要参数,或者即使这是可能的统一。统一自动工厂与参数

例如,我知道我能做到这一点:

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中做到这一点,并用最少的代码。

回答

28

对不起,成为那些回答自己的问题,但我想出来的那些恼人的人之一。

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"); 
+0

是否有可能做这样的事情,但使用构造函数注入? – dmigo 2015-06-18 14:08:13

+0

@Chesheersky上面的例子使用构造函数注入。 – TheCodeKing 2015-06-18 18:26:14

+0

对,我的错误:) – dmigo 2015-06-21 12:09:39

1

如果你正在寻找一个完全类型的工厂接口(允许XML文件和参数名称,例如),你可以使用一个NuGet package我创建的,你可以利用简单地通过定义一个接口工厂,然后将其与您要实例化的具体类型关联。

代码在GitHub上:https://github.com/PombeirP/FactoryGenerator

+0

正是我需要的。建议你添加一个例子到你的答案就像这里:http://blog.ploeh.dk/2012/03/15/ImplementinganAbstractFactory/在动态代理部分。 – Ghosthack 2016-01-22 08:30:07

5

通过@TheCodeKing答案工作正常,但在大多数情况下,可以缩短为以下(可能所有):

Container.RegisterInstance<Func<string, ILog>>(name => new Log(name)); 

(注意,我“M使用RegisterType()RegisterInstance()代替)

由于Func<>实施已经是一种工厂通常有否N将其包裹在InjectionFactory中。它只能确保Func<string, ILog>的每个分辨率都是一个新实例,我不能真正想到需要这样的场景。