Завод Виндзорский замок - PullRequest
1 голос
/ 04 января 2012

Когда вызывается _fwf.GetFileWatcher , всегда возвращается MailWatcher. Как я могу вернуть класс FileWatcher с типизированным заводским средством? Я попробовал блок кода, как показано ниже, но это всегда первый компонент.

Также я попробовал DefaultTypedFactoryComponentSelector, но я не могу получить результат.

 public interface IWatcher : IDisposable
{
    void StartWatching();
}

public class MailWatcher : IWatcher
{

    public void StartWatching()
    {
        Console.WriteLine("Mail watcher");
    }

    public void Dispose()
    {
        throw new NotImplementedException();
    }
}

 public class FileWatcher : IWatcher
{
    public void StartWatching()
    {
        Console.WriteLine("File watcher");
    }

    public void Dispose()
    {
        throw new NotImplementedException();
    }
}

public interface IFileWatcherFactory : IDisposable
{
    IWatcher GetWatcher(string path);
    void Destroy(IWatcher fw);
}

 public class Bootstrapper
{
    private static WindsorContainer _container;
    private static IFileWatcherFactory _fwf;

    public static void Initialize()
    {
        _container = new WindsorContainer();
        _container.AddFacility<TypedFactoryFacility>();

        _container.Register(Component.For<IWatcher>().ImplementedBy<MailWatcher>().LifeStyle.Transient);
        _container.Register(Component.For<IWatcher>().ImplementedBy<FileWatcher>().LifeStyle.Transient);

        _container.Register(Component.For<IFileWatcherFactory>().AsFactory(x => x.SelectedWith(new FileWatcherSelector())));

        _fwf = _container.Resolve<IFileWatcherFactory>();
        strong textvar fw = _fwf.GetFileWatcher("file", 20); 
        fw.StartWatching();
    }
}

1 Ответ

1 голос
/ 15 сентября 2014

Для тех, кто смотрит на это, используя TypedFactoryFacility, чтобы указать, какой тип будет создаваться Фабрикой, если это варьируется, вы можете использовать соглашение Get [Name], в котором ваш интерфейс будет иметь метод create для каждого типа реализации.*

public class MailWatcher : IWatcher
{

    public void StartWatching()
    {
        Console.WriteLine("Mail watcher");
    }

    public void Dispose()
    {
        throw new NotImplementedException();
    }
}

public class FileWatcher : IWatcher
{
    public void StartWatching()
    {
        Console.WriteLine("File watcher");
    }

    public void Dispose()
    {
        throw new NotImplementedException();
    }
}

public interface IFileWatcherFactory : IDisposable
{
    IWatcher GetMailWatcher(string path);
    IWatcher GetFileWatcher(string path);
    void Destroy(IWatcher fw);
}

public class Bootstrapper
{
    private static WindsorContainer _container;
    private static IFileWatcherFactory _fwf;

    public static void Initialize()
    {
        _container = new WindsorContainer();
        _container.AddFacility<TypedFactoryFacility>();

        _container.Register(Component.For<IWatcher>().ImplementedBy<MailWatcher>().Named("MailWatcher").LifeStyle.Transient);
        _container.Register(Component.For<IWatcher>().ImplementedBy<FileWatcher>().Named("FileWatcher").LifeStyle.Transient);

        _container.Register(Component.For<IFileWatcherFactory>().AsFactory());

        _fwf = _container.Resolve<IFileWatcherFactory>();
        var fw = _fwf.GetFileWatcher("file", 20); 
        fw.StartWatching();
    }
}

Для получения дополнительной информации, пожалуйста, обращайтесь к:

http://docs.castleproject.org/Windsor.Typed-Factory-Facility-interface-based-factories.ashx#Get_methods_lookup_components_by_name_4

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...