2013-06-06 2 views
1

я использую замок Виндзор в моем C# проекта DI и я такой сценарий:Виндзорский замок объект завод «GetByName» инъекционные свойства

public class Class1:IMyClass 
{ 
    public string Name{get{return "Class1";}} 
    public int Version {get; set;} 
    private string _description; 

    public Class1(string description) 
    { 
     this._description=description; 
    } 
} 
public class Class2:IMyClass 
{ 
    public string Name{get{return "Class2";}} 
    public int Version {get; set;} 
    private string _description; 

    public Class2(string description) 
    { 
     this._description=description; 
    } 
} 

Я могу зарегистрировать эти классы общим интерфейсом IMyClass, но теперь мне нужно фабрика для создания определенного экземпляра; что-то вроде этого:

IMyClass _myClass= someClassFactory.GetByName("Class2", version=1, description="test"); 

Есть ли пример для завода, устраняющего компонент по имени и инъекционные свойства и/или значения конструктора?

ответ

1

Абсолютно верно Криштиану. Здесь немного больше информации. Независимо от того, как вы пишете свою фабрику, вы не сможете создать компонент на основе свойства Name. Причина этого в том, что свойство доступно только после создания объекта, и фабрика нуждается в нем до этого.

Создание завода:

interface ISomeClassFactory 
{ 
    IMyClass GetById(string name, int version, string description); 
} 

и селектор (скопированный из: http://docs.castleproject.org/Windsor.Typed-Factory-Facility-interface-based-factories.ashx)

public class CustomTypedFactoryComponentSelector : DefaultTypedFactoryComponentSelector 
{ 
    protected override string GetComponentName(MethodInfo method, object[] arguments) 
    { 
     if(method.Name == "GetById" && arguments.Length == 1 && arguments[0] is string) 
     { 
      return (string)arguments[0]; 
     } 
     return base.GetComponentName(method, arguments); 
    } 
} 

и зарегистрировать их следующим образом:

Component.For<IMyClass>().ImplementedBy<Class1>().Named("Class1"), 
Component.For<IMyClass>().ImplementedBy<Class2>().Named("Class2") 
Component.For<IISomeClassFactory>().AsFactory(c=> new CustomTypedFactoryComponentSelector()) 

Также убедитесь, чтобы добавить TypedFactoryВместимость контейнера.

Смежные вопросы