2016-08-12 6 views
1

named override를 통해 내 의존성을 등록 할 때 Dependency Resolver가 구성 요소를 올바르게 해결하려고 애쓰는 것을 보았습니다. 첫 번째 인스턴스가 제공되는 것처럼 보입니다. ctor 주입으로 모든 것이 잘됩니다.Resolve Dependencies Resolver with Dependency Resolver

예 :

등록

RegisterProvider<IAccountProvider, AccountProvider>(); 
RegisterProvider<IAccountProvider, CustomAccountProvider>("customAccountProvider"); 

해상도

var instance = DependecyResolver.Current.GetService<IAccountProvider>(); 

customAccountProvider에게 인스턴스를 검색 할 수 없습니다. 항상 명명 된 제약 조건을 무시하고 처음 등록 된 구성 요소를 참조합니다.

답변

0

동일한 구성 요소가 여러 개 구현 된 경우 이름을 지정하거나 마킹 인터페이스로 표시해야합니다. 다음은 인스턴스의 이름을 지정하는 코드 예제입니다.

using System; 
using System.Linq; 
using System.Reflection; 
using Castle.Facilities.TypedFactory; 
using Castle.MicroKernel; 
using Castle.MicroKernel.Registration; 
using Castle.Windsor; 

namespace ResolvingNamedInctances 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var container = new WindsorContainer(); 
      container.AddFacility<TypedFactoryFacility>(); 

      container.Register(Component.For<ITypedFactoryComponentSelector>().ImplementedBy<AccountProviderTypeSelector>()); 
      container.Register(Component.For<IAccountProviderSelector>().AsFactory(typeof(AccountProviderTypeSelector))); 


      container.Register(Component.For<IAccountProvider>().ImplementedBy<DefaultAccountProvider>().Named("default")); 
      container.Register(Component.For<IAccountProvider>().ImplementedBy<CustomAccountProvider>().Named("custom")); 

      // uncomment this line in MVC app and use DependencyResolver instead of container 
      //DependencyResolver.SetResolver(new WindsorDependencyResolver(container.Kernel)); 

      var accountProviderSelector = container.Resolve<IAccountProviderSelector>(); 

      var defaultAccountProvider = accountProviderSelector.GetAccountProvider(); // default 
      defaultAccountProvider.Provide(); 


      var customAccountProvider = accountProviderSelector.GetAccountProvider("custom"); 
      customAccountProvider.Provide(); 

      Console.ReadLine(); 
     } 
    } 

    public class AccountProviderTypeSelector : ITypedFactoryComponentSelector 
    { 
     public Func<IKernelInternal, IReleasePolicy, object> SelectComponent(MethodInfo method, Type type, object[] arguments) 
     { 

      string providerName = arguments.Length > 0 ? (string)arguments[0] : "default"; 
      return (k, r) => k.GetHandlers(typeof(IAccountProvider)) 
       .Where(
        h => 
        { 

         return h.ComponentModel.Name == providerName; 
        }) 
       .Select(h => (IAccountProvider)k.Resolve(
        h.ComponentModel.Name, 
        typeof(IAccountProvider), 
        new Arguments { }, 
        r)) 
      .FirstOrDefault(); 
     } 
    } 

    public interface IAccountProviderSelector 
    { 
     IAccountProvider GetAccountProvider(); 
     IAccountProvider GetAccountProvider(string nameIdentifier); 
    } 

    public interface IAccountProvider 
    { 
     void Provide(); 
    } 

    public class DefaultAccountProvider : IAccountProvider 
    { 
     public void Provide() 
     { 
      Console.WriteLine("Working in default AccountProvider"); 
     } 
    } 

    public class CustomAccountProvider : IAccountProvider 
    { 
     public void Provide() 
     { 
      Console.WriteLine("Working in standart CustomAccountProvider"); 
     } 
    } 
}