标签: structuremap

结构图 - 我不想使用最贪婪的构造函数!

我正在尝试使用Structure Map在我的项目中配置NCommon NHRepository.如何阻止它选择最贪婪的构造函数?

 public class NHRepository<TEntity> : RepositoryBase<TEntity>
 {

    public NHRepository () {}


    public NHRepository(ISession session)
    {
        _privateSession = session; 
    }

    ...
}
Run Code Online (Sandbox Code Playgroud)

我的结构图配置

ForRequestedType(typeof (IRepository<>))
                .TheDefaultIsConcreteType(typeof(NHRepository<>))
Run Code Online (Sandbox Code Playgroud)

干杯杰克

structuremap

7
推荐指数
1
解决办法
999
查看次数

StructureMap异常代码205缺少请求的实例属性

我正在尝试最新的StructureMap构建,以了解IoC容器等.作为我的第一次测试,我有以下课程:

public class Hospital
    {
        private Person Person { get; set; }
        private int Level { get; set; }

        public Hospital(Person employee, int level)
        {
            Person = employee;
            Level = level;
        }

        public void ShowId()
        {
            Console.WriteLine(this.Level);
            this.Person.Identify();
        }
    }
Run Code Online (Sandbox Code Playgroud)

然后我像这样使用StructureMap:

static void Main()
        {
            ObjectFactory.Configure(x =>
                                        {
                                            x.For<Person>().Use<Doctor>();
                                            x.ForConcreteType<Hospital>().Configure.Ctor<int>().Equals(23);
                                        });

            var h = ObjectFactory.GetInstance<Hospital>();

            h.ShowId();
        } 
Run Code Online (Sandbox Code Playgroud)

所以我将Doctor对象作为第一个构造函数param传递给Hospital,我正在尝试将levelparam 设置为23.当我运行上面的代码时,我得到:

未处理的异常:StructureMap.StructureMapException:StructureMap异常代码:205缺少所请求的实例属性"level"for InstanceKey"5f8c4b74-a398-43f7- 91d5-cfefcdf120cf"

所以看起来我根本就没有设置level参数.有人能指出我正确的方向 - 如何level在构造函数中设置参数?

干杯.雅.

structuremap

7
推荐指数
1
解决办法
4558
查看次数

如何在不依赖NHibernate的情况下为每个请求实现NHibernate会话?

我之前提出过这个问题,但我仍然在努力寻找一个可以让我理解的例子(请不要只是告诉我看看S#arp架构项目,至少没有一些方向).

到目前为止,我已经在我的网络项目中实现了近乎持久的无知.我的存储库类(在我的数据项目中)在构造函数中使用了一个ISession:

public class ProductRepository : IProductRepository
{
    private ISession _session;
    public ProductRepository(ISession session) {
        _session = session;
    }
Run Code Online (Sandbox Code Playgroud)

在我的global.asax中,我公开当前会话,并在beginrequest和endrequest上创建和处理会话(这是我对NHibernate的依赖):

    public static ISessionFactory SessionFactory = CreateSessionFactory();

    private static ISessionFactory CreateSessionFactory() {
        return new Configuration() 
            .Configure()
            .BuildSessionFactory();
    }

    protected MvcApplication()  {
        BeginRequest += delegate {
            CurrentSessionContext.Bind(SessionFactory.OpenSession());
        };
        EndRequest += delegate {
            CurrentSessionContext.Unbind(SessionFactory).Dispose();
        };
    }
Run Code Online (Sandbox Code Playgroud)

最后我的StructureMap注册表:

    public AppRegistry() {
        For<ISession>().TheDefault
            .Is.ConstructedBy(x => MvcApplication.SessionFactory.GetCurrentSession());

        For<IProductRepository>().Use<ProductRepository>();
    }
Run Code Online (Sandbox Code Playgroud)

看来我需要我自己的ISession和ISessionFactory的通用实现,我可以在我的web项目中使用它并注入我的存储库?

所以只是为了澄清 - 我在我的存储库层使用NHibernate并希望使用session-per-(http)请求.因此,我正在向我的存储库构造函数中注入一个ISession(使用structuremap).目前,为了在每个请求中创建和处理会话,我必须从我的web项目中引用NHibernate.这是我想要删除的依赖项.

谢谢,本

structuremap nhibernate asp.net-mvc dependency-injection

7
推荐指数
1
解决办法
5773
查看次数

StructureMap从线程局部范围返回已处置的nHibenrate会话对象

[OR]如何为http请求和石英作业使用UoW定义StructureMap生命周期

我有这个使用SM for IoC的Web应用程序.我正在使用HybridHttpOrThreadLocalScoped范围来存储我的nHibernate ISession对象.这适用于我的Web请求的每个请求时段的会话.

但我也有quartz.net安排几个工作.该作业使用相同的工作单元来获取ISession对象.在这种情况下,当调度程序启动作业时,一切正常,并且作业运行良好几次UNTIL作业线程ID重复.

想象一下,当作业被安排时,它开始在具有id 11,12,13的线程中运行,然后再次使用线程ID 11.此时,structuremap返回一个已经处理好的会话对象,我得到"System.ObjectDisposedException:Session is closed!" 错误.

因此,从我所看到的,会话保存在线程本地存储中,在我的工作单元结束后处理会话后,会话对象仍保留在线程本地存储中.似乎在线程终止之后它的本地存储没有被清除,并且当某个新的线程具有相同的id时,structmap会查找旧线程本地存储中的会话(应该为新线程清除我认为并返回已经处理的会话对象.

问题:

  1. 有没有办法清除线程本地存储(终止时)?
  2. 对于线程范围的对象,是否存在等效的"ReleaseAndDisposeAllHttpScopedObjects"?
  3. 有没有办法使处置的对象无效(或弹出),所以即使SM找到它然后它也找不到任何东西并且必须创建一个新的实例?

我希望我明白我的问题.这花费了我几个小时的时间,但我还没有找到解决办法.我很欣赏任何提示:>

更新: 我添加了自己的解决方案,使StructureMap服务的UoW同时处理http请求和石英作业.如果您有更好/更容易/更简单的解决方案,请告诉我.

.net structuremap nhibernate multithreading quartz.net

7
推荐指数
1
解决办法
1421
查看次数

StructureMap并注入IEnumerable <T>

我是StructureMap的新手,并且我正在使用一些使用StructureMap 2.5.4的现有代码.

有一个使用StructureMap构造的类,它有一个构造函数IEnumerable<ICar>作为参数.

注册表具有以下代码.

Scan(x =>
{
   x.TheCallingAssembly();
   x.WithDefaultConventions();
   x.AddAllTypesOf<ICar>();
   }
);

ForRequestedType<IEnumerable<ICar>>().TheDefault.Is.ConstructedBy(
            x => ObjectFactory.GetAllInstances<ICar>());
Run Code Online (Sandbox Code Playgroud)

我正在编写一个单元测试,并从ObjectFactory获取了一个嵌套容器,并使用Inject方法注入了一个实例.ICar的一个实例应该在其构造函数中接收注入类型.但它没有工作,我跟踪到了不使用我的嵌套容器的ObjectFactory.GetAllInstances()调用.

我怎样才能让它发挥作用?

我还读到了关于StructureMap自动装配数组和IEnumerable实例,但我无法让它工作.

有没有更好的方法来重写上面的注册表代码,以便IEnumerable<ICar>创建一个实例并使用我嵌套容器中的注入类型?

.net structuremap dependency-injection ioc-container

7
推荐指数
1
解决办法
2736
查看次数

Structuremap处理DataContext对象

我想确定每个请求结束后,structuremap是否会处理我的DataContext.

这是我的设置

ForRequestedType<MyDataContext>().TheDefault.Is.OfConcreteType<MyDataContext>();
SelectConstructor<MyDataContext>(() => new MyDataContext());
Run Code Online (Sandbox Code Playgroud)

结构图会自动处理我的datacontext还是我需要手动调用Dispose?

structuremap asp.net-mvc dispose

7
推荐指数
2
解决办法
2716
查看次数

ASP.NET中的跨进程模拟

我正在使用ASP.NET MVC 3构建REST API.我正在使用SpecFlow和NUnit作为测试运行器来实现BDD风格.

由于它是一个REST API,因此测试Url:s显然非常重要,因此我希望能够在规范中进行真正的HTTP调用.

我现在正在寻找有关如何实现Cross Process Mocking的技巧.简而言之,我想用我在Specs中生成的实体来模拟数据层.

在Rails应用程序中,我会使用Webrat.有没有相当于.NET的东西呢?

我已经尝试过Deleporter,但它似乎无法"发送"高级构造(在规范中创建一个简单的字符串并在Deleporter中使用它,但不适用于自定义类,属性都变为null)

有没有人有关于如何做到这一点的经验或提示?

编辑:我在Deleporter尝试做的事情是这样的(我知道我可以在Deleporter代码中生成模型,但这是一个简化的例子,所以这对我不起作用):

var models = Builder<Foo>.CreateListOfSize(300);
Deleporter.Run(() =>
{
  var mockService = new Mock<IFooService>();
  // Models will be a list of 300 Foos but the foos properties will all be null
  mockService.Setup(s => s.GetStuff()).Returns(models);
  ObjectFactory.Inject(mockService.Object);
});
Run Code Online (Sandbox Code Playgroud)

c# structuremap bdd specflow asp.net-mvc-3

7
推荐指数
1
解决办法
632
查看次数

我在哪里可以找到最新的StructureMap文档?

http://docs.structuremap.net/似乎有很多使用已弃用成员的旧示例.有没有一个地方可以找到最新的StructureMap doco?

structuremap

7
推荐指数
1
解决办法
714
查看次数

StructureMap在HttpContext上抛出ArgumentNullException

我有一个非常奇怪的问题 StructureMap.MVC5

我在Visual Studio中创建了一个全新的MVC5项目(选择了ASP.net MVC项目的默认选项.)

然后我通过nuget包管理器(Install-Package StructureMap.MVC)安装了structuremap.mvc5 .

然后我将以下代码添加到"HomeController.cs"文件的顶部:

namespace TestMVC.Controllers
{
    public interface ITest
    {
        string TestMessage();
    }
    public class Test : ITest
    {
        public string TestMessage()
        {
            return "this worked again 23";
        }
    }
Run Code Online (Sandbox Code Playgroud)

然后我添加了一个构造函数和私有成员,如下所示:

public class HomeController : Controller
{
    private readonly ITest _test;

    public HomeController(ITest test)
    {
        _test = test;
    }
Run Code Online (Sandbox Code Playgroud)

最后,我更新了About操作结果,如下所示:

public ActionResult About()
{
    ViewBag.Message = _test.TestMessage();

    return View();
}
Run Code Online (Sandbox Code Playgroud)

该项目编译并启动.我得到了正常的默认索引页面,但是在浏览器中返回页面后的2到5秒之间,我在return此方法的行中的"StructureMapDependencyScope.cs"中抛出异常:

private HttpContextBase HttpContext {
    get {
        var ctx = …
Run Code Online (Sandbox Code Playgroud)

c# structuremap asp.net-mvc structuremap3

7
推荐指数
1
解决办法
1267
查看次数

如何使用StrcutureMap依赖注入在Web API测试中模拟AutoMapper IMapper对象?

所以我从头开始构建WebAPI,包括我在网上找到的一些最佳实践,例如依赖注入和使用自动映射器的域< - > DTO映射等.

我的API控制器现在看起来与此类似

public MyController(IMapper mapper)
{
}
Run Code Online (Sandbox Code Playgroud)

和AutoMapper注册表:

public AutoMapperRegistry()
{
    var profiles = from t in typeof(AutoMapperRegistry).Assembly.GetTypes()
                   where typeof(Profile).IsAssignableFrom(t)
                   select (Profile)Activator.CreateInstance(t);

    var config = new MapperConfiguration(cfg =>
    {
        foreach (var profile in profiles)
        {
            cfg.AddProfile(profile);
        }
    });

    For<MapperConfiguration>().Use(config);
    For<IMapper>().Use(ctx => ctx.GetInstance<MapperConfiguration>().CreateMapper(ctx.GetInstance));
}
Run Code Online (Sandbox Code Playgroud)

我也在构建一些测试用例,实现MOQ,这是我感到有些不确定的地方.每当调用我的控制器时,我需要传递一个IMapper,如下所示:

var mockMapper = new Mock<IMapper>();
var controller = new MyController(mockMapper.Object);
Run Code Online (Sandbox Code Playgroud)

但是,如何配置IMapper以获得正确的映射?在配置Mapper之前重新创建我已经创建的相同逻辑会感觉多余.所以我想知道这样做的推荐方法是什么?

structuremap unit-testing moq automapper asp.net-web-api

7
推荐指数
2
解决办法
7753
查看次数