2016-08-12 6 views
1

Я заметил, что когда я регистрирую свои зависимости через именованные переопределения, Dependency Resolver борется за правильное решение компонентов. Кажется, что первый экземпляр предоставлен. Все в порядке с инъекцией ctor.Разрешить именованные зависимости с помощью Resalver Dependency

Пример:

Регистрация

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"); 
     } 
    } 
}