2010-09-23 27 views
0

我有一个实现“ITestProperty”的对象“TestProperty”。 “TestProperty”采用字符串构造函数参数。这是在StructureMap中使用CtorDependency或WithCtorArg行配置的。StructureMap如何被用来创建具有原始构造函数argumeents的对象的setter依赖关系?

我想注入一个“ITestProperty”实例(用“TestProperty”实现)到另一个类中作为属性。当我尝试运行代码时,我得到一个异常(StructureMap Error Code 205,“Missing requested Instance property”)。

下面是一个简化版本,再现问题:

测试:

[Test] 
public void Can_resolve_the_correct_property() 
{ 
    ObjectFactory.Initialize(x => x.AddRegistry(new TestRegistry())); 

    var instance = ObjectFactory.GetInstance<TestController>(); 
} 

注册表设置:

public class TestRegistry : Registry 
{ 
    public TestRegistry() 
    { 
     ForRequestedType<ITestProperty>().AddInstances( 
      i => i.OfConcreteType<TestProperty>().WithName("Test") 
       .CtorDependency<string>("arg").Is("abc") 
     ); 

     //ForConcreteType<TestProperty>().Configure 
      .CtorDependency<string>("arg").Is("abc"); 

     ForConcreteType<TestController>().Configure 
      .SetterDependency(p => p.Property).Is<TestProperty>() 
      .WithName("Test"); 
    } 
} 

测试对象:

public interface ITestProperty { } 

public class TestProperty : ITestProperty 
{ 
    private readonly string arg; 

    public TestProperty(string arg) 
    { 
     this.arg = arg; 
    } 

    public string Arg { get { return arg; } } 
} 

public class TestController 
{ 
    public ITestProperty Property { get; set; } 
} 

当我们去初始在抛出异常的时候使用“TestController”对象。是否可以使用StructureMap来做到这一点?假设这是可能的,我需要做些什么才能使它工作?

在此先感谢。

+1

您的注册显示您创建一个命名实例“测试”,但您的测试代码只是请求默认实例(没有指定名称)。实例命名是否相关? – 2010-09-23 12:15:10

+0

是的,这是我们在生产中的简化版本 - 我们有多个实例。也就是说,如果可能的话,我宁愿不使用命名实例,只是处理类型 - 我们之前还有其他一些原因。 – 2010-09-23 21:18:56

回答

1

有几种方法可以做到这一点,因为乔希提到,如果命名实例是非常重要的,那么你在你的注册表希望这样:

ForRequestedType<ITestProperty>().AddInstances(i => 
    i.OfConcreteType<TestProperty>().WithName("Test") 
     .WithCtorArg("arg").EqualTo("abc")); 

ForConcreteType<TestController>().Configure 
    .SetterDependency(p => p.Property).Is(c => c 
     .GetInstance<ITestProperty>("Test")); 

否则,你可以这样做:

ForRequestedType<ITestProperty>().TheDefault.Is 
    .OfConcreteType<TestProperty>() 
    .WithCtorArg("arg").EqualTo("abc"); 

ForConcreteType<TestController>().Configure 
    .SetterDependency(p => p.Property).IsTheDefault(); 

此外,这是旧的StructureMap语法,您可能想要更新到最新版本。这里是新的语法:

For<ITestProperty>().Add<TestProperty>().Named("Test") 
    .Ctor<string>("arg").Is("abc"); 

ForConcreteType<TestController>().Configure 
    .Setter(p => p.Property).Is(c => c 
     .GetInstance<ITestProperty>("Test")); 
+0

谢谢罗宾。我们必须升级和使用选项三,但它的工作完美。干杯。 – 2010-09-23 23:32:05

+0

我想使用此代码在我的自定义ActionFilterAttribute中注入一个Func 作为setter。我根本无法使用此代码将它们连接在一起。任何想法为什么? – Joel 2013-09-02 12:23:19

+0

不是没有看到代码,我已经离开了StructureMap很长一段时间了。也许发布一个新问题? – 2013-09-03 17:55:08

相关问题