2011-02-14 9 views
6

, ben iService iService StructureMap ile aynı arayüze farklı ConcreteClasses nasıl eşlenir? Controller1 oluşturulan edilirken

ConcretePageService2

için ConcreteService2 ve IPageService eşleştirilmiş olacağını ConcretePageService1

Ve Controller2 oluşturulduğunda, istediğim için ConcreteService1 ve IPageService eşleştirilmiş olacağını istiyorum nasıl Yukarıdakiler çalışacak şekilde ObjectFactory'yi başlatabilir mi? (Kontrolör türünden bağımsız IPageService için iService ve ConcretePageService1 için ConstructedBy içine

public class Controller1 : Controller 
{ 
    public Controller1(IService service, IPageService pageService) 
    { 
    } 
} 

public class Controller2 : Controller 
{ 
    public Controller2(IService service, IPageService pageService)    
    {   
    } 
} 

public interface IService 
{ 
} 
public class ConcreteService1:IService 
{ 
} 
public class ConcreteService2:IService 
{ 
} 

public interface IPageService 
{ 
} 
public class ConcretePageService1:IPageService 
{ 
} 
public class ConcretePageService2:IPageService 
{ 
} 

cevap

12

o her denetleyiciye belirli bir örneğini eşleştirmek için adlandırılmış örneğini kullanabilir sadece izole bir kayıt buysa.

For<IService>().Add<ConcreteService1>().Named("service1"); 
For<IService>().Add<ConcreteService2>().Named("service2");    
For<IPageService>().Add<PageService1>().Named("pageService1"); 
For<IPageService>().Add<PageService2>().Named("pageService2");    
For<Controller1>().Use<Controller1>() 
    .Ctor<IService>().Is(c => c.GetNamedInstance<IService>("service1")) 
    .Ctor<IPageService>().Is(
    c => c.GetNamedInstance<IPageService>("pageService1")); 
For<Controller2>().Use<Controller2>() 
    .Ctor<IService>().Is(
    c => c.GetNamedInstance<IService>("service2")) 
    .Ctor<IPageService>().Is(
    c => c.GetNamedInstance<IPageService>("pageService2")); 

bu da tüm bu tekrarlardan kaçınmak için türlerini eşleştirmek için bir convention kullanmalıdır uygulamada tekrarlanır bir desen ise.

Tür adıyla adlandırılan türler, yerleşik bir kuralı kullanarak eklenebilir.

Scan(x => 
    { 
    x.AssembliesFromApplicationBaseDirectory(); 
    x.AddAllTypesOf<IService>().NameBy(type => type.Name); 
    x.AddAllTypesOf<IPageService>().NameBy(type => type.Name); 
    x.WithDefaultConventions(); 
    }); 
+2

Bunun için teşekkürler. StructueMap belgeleri cehennem gibi sarılmış ve bunu bulamadım. –

0

Bak ConcreteService1

ObjectFactory.Initialize(x => 
    { 
     x.For<IService>().Use<ConcreteService1>(); 
     x.For<IPageService>().Use<ConcretePageService1>(); 
    }); 

Ama bu DAİMA eşler: Ben bu şekilde ObjectFactory initialezed

Ortalama süre) StructureMap için sözdizimi.

Bu sayfada, ama bu SM için en son docs ise emin değilim:

http://structuremap.net/structuremap/InstanceExpression.htm#section18

Ben ConsructedBy hakkında yanlış olabilir - docs çok iyi değildir. Benzer bir soru için aşağıdaki bak:

StructureMap Conditional use

+0

Bunu okudum, ama bunun nasıl yanıt verdiğimi anlamıyorum veya bir şeyi mi özlüyorum? Teşekkürler – theateist

+1

Koşullar IMO'ya gitmenin yolu değildir. Bir sözleşmenin dayanıklı bir çözüm olması daha olasıdır. – PHeiberg

İlgili konular