1

我有一个问题Structuremap决心类型.... 免得说我有这样一个类:与参数

public class A: InterfaceA 
{ 
    private FileInfo _fileInfo = null; 
    public A(FileInfo fileInfo) 
    { 
     this._fileInfo = fileInfo; 
    } 

    ... 
} 

和另一个问题:

public class B: InterfaceB 
{ 
    private A _classA = null; 
    public B(A classA) 
    { 
     this._classA = classA; 
    } 

    public void Do() 
    { 
     FileInfo fi = new FileInfo(...); 
     _classA.DoSomething(); 
    } 
} 

现在,我已经安装StructureMap寄存器是这样的:

For<InterfaceA>().Use<A>(); 
For<InterfaceB>().Use<B>(); 

当我执行B.Do()时,结构图会抛出错误,因为FileInfo参数没有注册表项。 A类(FileInfo)的参数在B类中构造; 我知道我可以这样做:ObjectFactor.GetInstance()并传递参数,但我想依赖注入而不是服务提供者。我希望当我做ObjectFactory.GetInstance()时,来构造整个对象图。

如何做到这一点?

回答

4

您可以使用Ctor指令来告知SM对Ctor参数使用哪些对象。

var myFile = new FileInfo(...); 
For<InterfaceA>.Use<A>().Ctor<FileInfo>().Is(myFile); 

了解更多关于构造函数的参数here

编辑: 如果文件名不知道,直到B中的待办事项方法的执行,你有,直到执行DO方法推迟A-对象的创建。为了这样做,您可以使用工厂,无论是手工编码还是Func/Lazy。

对于函数求方法,你可以改变你的B拍摄A的函数功能为构造函数依赖:

public class B : InterfaceB 
{ 
    private readonly Func<string, InterfaceA> _aBuilder; 
    public B(Func<string, InterfaceA> aBuilder) 
    { 
    _aBuilder = aBuilder; 
    } 

    public void Do() 
    { 
    InterfaceA anA = _aBuilder("fileName"); 
    anA.DoSomething(); 
    } 
} 

引导使用背带它:

ObjectFactory.Initialize(
    c=> 
    { 
    c.For<InterfaceA>().Use<A>(); 
    c.For<Func<string, InterfaceA>>().Use(d => 
     new Func<string, InterfaceA>(s => 
     ObjectFactory.With(new FileInfo(s)).GetInstance<InterfaceA>())); 
    c.For<InterfaceB>().Use<B>(); 
    } 
); 
+0

如果在执行Do方法之前未知文件名,则必须采用工厂方法或考虑将文件传递给方法。 – PHeiberg 2010-09-06 11:00:19

+0

编辑我的答案包括工厂方法。 – PHeiberg 2010-09-06 12:01:14