2012-01-04 124 views
1

_fwf.GetFileWatcher被調用時,總是MailWatcher正在返回。我怎樣才能返回類型工廠設施的FileWatcher類?我嘗試了下面的代碼塊,但這總是第一個組件。Castle Windsor Typed Factory Facility

另外我試過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(); 
    } 
} 
+0

什麼FileWatcherSelector看起來不一樣? – 2012-01-04 13:54:47

+1

我有點困惑......爲了調用GetFileWatcher(「file」,20),你的IFileWatcherFactory應該包含方法/簽名和nameconvetion將解決/創建FileWatcher的一個實例,該實例應該有自己的2個參數構造函數。我想你在FileWatcherSelector中做了一些錯誤的魔術。 – Crixo 2012-01-04 14:58:22

回答

1

對於任何人在看這個,使用TypedFactoryFacility,以決定是否該改變工廠將創建類型,您可以使用Get [名稱]約定,你的界面將爲每個實施創建方法類型。

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