Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

StructureMap 2.5 and internal implementors

is it possible to get this stuff working(some way to force Objectfactory create instances like Activator)

in the below example everything is placed in a sigle assembly

public interface IUnitOfWorkFactory
{
    IUnitOfWork Create();
}

internal class NHUnitOfWorkFactory : IUnitOfWorkFactory
{
    public IUnitOfWork Create()
    {
        ////  do needed stuff
    }
}

bootstrapping :

ObjectFactory.Configure(x =>
{
    x.ForRequesedType<IUnitOfWorkFactory>.TheDefaultIsConcreteType<NHUnitOfWorkFactory>();
}); 

usage:

IUnitOfWorkFactory factory = ObjectFactory.GetInstance<IUnitOfWorkFactory>();

My result:

Porktal.Core.Tests.UnitOfWorkTests.Can_Start_Unit_of_Work : StructureMap.StructureMapException : StructureMap Exception Code:  207
Internal exception while creating Instance 'Porktal.Core.Data.NH.NHUnitOfWorkFactory, Porktal.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' of PluginType Porktal.Core.Data.IUnitOfWorkFactory.  Check the inner exception for more details.
---- System.MethodAccessException : Porktal.Core.Data.NH.NHUnitOfWorkFactory..ctor()
Stack Trace:
   at StructureMap.Pipeline.ConfiguredInstanceBase`1.StructureMap.Pipeline.IConfiguredInstance.Build(Type pluginType, BuildSession session, InstanceBuilder builder)
   at StructureMap.Pipeline.ConfiguredInstanceBase`1.build(Type pluginType, BuildSession session)
   at StructureMap.Pipeline.Instance.createRawObject(Type pluginType, BuildSession session)
   at StructureMap.Pipeline.Instance.Build(Type pluginType, BuildSession session)
   at StructureMap.Pipeline.BuildPolicy.Build(BuildSession buildSession, Type pluginType, Instance instance)
   at StructureMap.InstanceFactory.Build(BuildSession session, Instance instance)
   at StructureMap.BuildSession.CreateInstance(Type pluginType, Instance instance)
   at StructureMap.BuildSession.b__0(Type t)
   at StructureMap.Util.Cache`2.get_Item(KEY key)
   at StructureMap.BuildSession.CreateInstance(Type pluginType)
   at StructureMap.Container.GetInstance(Type pluginType)
   at StructureMap.Container.GetInstance[T]()
   at StructureMap.ObjectFactory.GetInstance[PLUGINTYPE]()
   at Porktal.Core.Bootstraper.Bootstrap() in D:\Porktal\Porktal.Core\Bootstraper.cs:line 20
   at Porktal.Core.Tests.UnitOfWorkTests.Can_Start_Unit_of_Work() in D:\Porktal\Porktal.Core.Tests\UnitOfWorkTests.cs:line 11
----- Inner Stack Trace -----
   at PorktalCoreDataNHNHUnitOfWorkFactoryInstanceBuilder44203c8113d44053be045df4db28c3dc.BuildInstance(IConfiguredInstance , BuildSession )
   at StructureMap.Pipeline.ConfiguredInstanceBase`1.StructureMap.Pipeline.IConfiguredInstance.Build(Type pluginType, BuildSession session, InstanceBuilder builder)

like image 260
Nikodem Avatar asked Dec 18 '25 00:12

Nikodem


1 Answers

You have 2 options. You can make NHUnitOfWorkFactory public (preferred).

Or you can put the code that constructs your internal class in your assembly (where it has access to internal members) in the form of a lambda , and pass it to StructureMap:

ObjectFactory.Configure(x => {
  x.ForRequestedType<IUnitOfWorkFactory>()
   .TheDefault.Is.ConstructedBy(() => new NHUnitOfWorkFactory())
});

The equivalent with newer versions of StructureMap is:

ObjectFactory.Configure(x => {
  x.For<IUnitOfWorkFactory>().Use(() => new NHUnitOfWorkFactory())
});
like image 152
Joshua Flanagan Avatar answered Dec 19 '25 12:12

Joshua Flanagan