c# - More control over instantiation of generic types? -


i trying use structuremap register types implement generic interface , instantiated via factory.

my code:

    public interface imanagerbase<t, tkey> : idisposable     {         // methods         t getbyid(tkey id);     }      public partial interface iserverhostmanager : imanagerbase<serverhost, int>     {         // serverhost specific methods     }          partial class serverhostmanager : managerbase<serverhost, int>, iserverhostmanager     {         // implementation     }      public class managerfactory : imanagerfactory     {         public iserverhostmanager getserverhostmanager()         {             return new serverhostmanager();         }     } 

this works fine:

 for<iserverhostmanager>().hybridhttporthreadlocalscoped() .use(new managerfactory().getserverhostmanager()); 

my factory called , new instance of iserverhostmanager returned.

is there way can scan generic types , have them instantiated via factory?

this not work due serverhostmanager being internal class:

        scan(x =>         {             x.assemblycontainingtype(typeof(imanagerbase<,>));             x.addalltypesof(typeof(imanagerbase<,>));             x.connectimplementationstotypesclosing(typeof(imanagerbase<,>))                 .onaddedplugintypes(t => t.hybridhttporthreadlocalscoped());         }); 

what scan command can use tell sm call factory?

thank you,

rick

followup added on 5/4:

sorry delay in following up.

i’ve got bunch of manager objects (> 75) codesmith’s nhibernate template has created. accessed via factory object. instead, i’d scan them have them registered automatically.

this how register objects now:

for<iactivitylogmanager>().hybridhttporthreadlocalscoped()  .use(new managerfactory().getactivitylogmanager());   for<iaspnetusermanager>().hybridhttporthreadlocalscoped()  .use(new managerfactory().getaspnetusermanager());  

here objects

public interface imanagerbase<t, tkey> : idisposable {     // methods      t getbyid(tkey id); }  public partial interface iactivitylogmanager : imanagerbase<businessobjects.activitylog, int> {     // methods     ilist<activitylog> getbyactivitytypeid(system.int32 activitytype); }  public partial class activitylogmanager : managerbase<businessobjects.activitylog, int>, iactivitylogmanager {     public ilist<activitylog> getbyactivitytypeid(system.int32 activitytype)     {         // code fetch objects     }     }  public partial interface iaspnetusermanager : imanagerbase<businessobjects.aspnetuser, system.guid> {     // methods     ilist<activitylog> getbyactivitytypeid(system.int32 activitytype); }  public partial class aspnetusermanager : managerbase<businessobjects.aspnetuser, system.guid>, iaspnetusermanager {     public ilist<aspnetuser> getall()     {         // code fetch objects     }     } 

my scan code:

scan(x =>      {          x.assemblycontainingtype(typeof(imanagerbase<,>));          x.addalltypesof(typeof(imanagerbase<,>));          x.connectimplementationstotypesclosing(typeof(imanagerbase<,>))              .onaddedplugintypes(t => t.hybridhttporthreadlocalscoped());          }); 

the scan code above not find objects in assembly.

i hope clarifies scenario.

thank you,

rick

this issue can solved making assembly friend:

[assembly: internalsvisibleto("assemblyb")] 

http://msdn.microsoft.com/en-us/library/0tke9fxk.aspx


Comments

Popular posts from this blog

javascript - Enclosure Memory Copies -

php - Replacing tags in braces, even nested tags, with regex -