2010-04-28 3 views
0

Я пытаюсь использовать StructureMap для регистрации некоторых типов, реализующих общий интерфейс и создаваемых через фабрику.Больше контроля над созданием типичных типов?

Мой код:

public interface IManagerBase<T, TKey> : IDisposable 
    { 
     // Get Methods 
     T GetById(TKey Id); 
    } 

    public partial interface IServerHostManager : IManagerBase<ServerHost, int> 
    { 
     // ServerHost Specific Get Methods 
    }  

    partial class ServerHostManager : ManagerBase<ServerHost, int>, IServerHostManager 
    { 
     // Implementation 
    } 

    public class ManagerFactory : IManagerFactory 
    { 
     public IServerHostManager GetServerHostManager() 
     { 
      return new ServerHostManager(); 
     } 
    } 

Это прекрасно работает:

For<IServerHostManager>().HybridHttpOrThreadLocalScoped() 
.Use(new ManagerFactory().GetServerHostManager()); 

Моя фабрика называется и новый экземпляр IServerHostManager возвращается.

Можно ли каким-либо образом сканировать для всех типов общего типа и создать их через мою фабрику?

Это не работает из-за ServerHostManager быть внутренний класс:

 Scan(x => 
     { 
      x.AssemblyContainingType(typeof(IManagerBase<,>)); 
      x.AddAllTypesOf(typeof(IManagerBase<,>)); 
      x.ConnectImplementationsToTypesClosing(typeof(IManagerBase<,>)) 
       .OnAddedPluginTypes(t => t.HybridHttpOrThreadLocalScoped()); 
     }); 

Что скан команда может использовать, чтобы сказать SM называть мою фабрику?

Спасибо,

Рик

Followup добавил на 5/4:

Извините за задержку в последующей деятельности.

У меня есть куча объектов-менеджеров (> 75), которые создал шаблон nHibernate CodeSmith. Обычно они доступны через заводский объект. Вместо этого, я бы хотел отсканировать их, чтобы они все регистрировались автоматически.

Это, как я теперь зарегистрировать объекты:

For<IActivityLogManager>().HybridHttpOrThreadLocalScoped() 
.Use(new ManagerFactory().GetActivityLogManager()); 

For<IAspnetUserManager>().HybridHttpOrThreadLocalScoped() 
.Use(new ManagerFactory().GetAspnetUserManager()); 

Вот объекты

public interface IManagerBase<T, TKey> : IDisposable 
{ 
    // Get Methods 
    T GetById(TKey Id); 
} 

public partial interface IActivityLogManager : IManagerBase<BusinessObjects.ActivityLog, int> 
{ 
    // Get Methods 
    IList<ActivityLog> GetByActivityTypeId(System.Int32 activityType); 
} 

public partial class ActivityLogManager : ManagerBase<BusinessObjects.ActivityLog, int>, IActivityLogManager 
{ 
    public IList<ActivityLog> GetByActivityTypeId(System.Int32 activityType) 
    { 
     // Code to fetch objects 
    }  
} 

public partial interface IAspnetUserManager : IManagerBase<BusinessObjects.AspnetUser, System.Guid> 
{ 
    // Get Methods 
    IList<ActivityLog> GetByActivityTypeId(System.Int32 activityType); 
} 

public partial class AspnetUserManager : ManagerBase<BusinessObjects.AspnetUser, System.Guid>, IAspnetUserManager 
{ 
    public IList<AspnetUser> GetAll() 
    { 
     // Code to fetch objects 
    }  
} 

Мой Скан код:

Scan(x => 
    { 
     x.AssemblyContainingType(typeof(IManagerBase<,>)); 
     x.AddAllTypesOf(typeof(IManagerBase<,>)); 
     x.ConnectImplementationsToTypesClosing(typeof(IManagerBase<,>)) 
      .OnAddedPluginTypes(t => t.HybridHttpOrThreadLocalScoped());  
    }); 

код сканирования выше не находит объектов в сборке.

Надеюсь, это прояснит мой сценарий.

Спасибо,

Рик

+0

Это не ясно, что другие типы вы хотите инстанцирован , Кажется, вы дали только один пример. Можете ли вы включить пример того, как вы будете регистрировать несколько генериков вручную, а затем, возможно, мы сможем помочь вам построить сканер конвенций, чтобы сделать это автоматически. –

+0

Я добавил к вышеуказанному сообщению. Спасибо. – rboarman

+0

Кто-нибудь ??? Сталкиваясь. – rboarman

ответ

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