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")]
Comments
Post a Comment