2016-02-19 77 views
0

对于下面的代码,我将如何根据名称解析?IoC StructureMap解析命名实例

public interface IService 
{} 

public class ServiceA : IService 
{} 

public class ServiceB : IService 
{} 

public class ClassA 
{ 
    public IService service { get; set; } 

    public ClassA(IService service) 
    { 
     this.service = service; 
    } 
} 

public class ClassB 
{ 
    public IService service { get; set; } 

    public ClassB(IService service) 
    { 
     this.service = service; 
    } 
} 

注册表:

public class MyRegistry : Registry 
{ 
    public MyRegistry() 
    { 
     For<IService>().Add<ServiceA>().Ctor<IService>().Is(i => i.GetInstance<IService>("ServiceA")); // error 
    } 
} 

用法:

container = new Container(new MyRegistry()); 
var test = container.GetInstance<ClassA>(); 

问题:

  • 对于ClassA的 IService =>应产量ServiceA
  • 对于ClassB的 IService =>应该产生ServiceB

  • 此外,有没有使用属性在构造函数中指定特定类型的具体实现的方法吗? (所以它没有在配置中指定?)

回答

0

我的工作是这样的> @ ozczcho的回答有帮助。谢谢

For<ClassA>().Use<ClassA>().Ctor<IService>("service").Is<ServiceA>(); 
    For<ClassB>().Use<ClassB>().Ctor<IService>("service").Is<ServiceB>(); 
0

我们已经创建了自己的RegistrationConvention(注意这个实现注册每个插件家庭为单身):

public class SingletonConvention<TPluginFamily> : IRegistrationConvention 
{ 
    public void Process(Type type, Registry registry) 
    { 
     if (!type.IsConcrete() || !type.CanBeCreated() || !type.AllInterfaces().Contains(typeof(TPluginFamily))) 
      return; 

     registry.For(typeof(TPluginFamily)).Singleton().Use(type).Named(type.Name); 
    } 
} 

然后在我们的注册表(未经测试):

 Scan(y => 
     { 
      y.With(new SingletonConvention<IService>()); 
      y.Assembly(Assembly.GetExecutingAssembly().FullName); 
     }); 

     For<ClassA>() 
      .Use<ClassA>() 
      .Ctor<IService >("service").Is("service",x => 
      { 
       var service = x.GetInstance<IService>().Named("ServiceA"); 

       return service; 
      })