我正在尝试使用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构建,以了解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在构造函数中设置参数?
干杯.雅.
我之前提出过这个问题,但我仍然在努力寻找一个可以让我理解的例子(请不要只是告诉我看看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.这是我想要删除的依赖项.
谢谢,本
[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会查找旧线程本地存储中的会话(应该为新线程清除我认为并返回已经处理的会话对象.
问题:
我希望我明白我的问题.这花费了我几个小时的时间,但我还没有找到解决办法.我很欣赏任何提示:>
更新: 我添加了自己的解决方案,使StructureMap服务的UoW同时处理http请求和石英作业.如果您有更好/更容易/更简单的解决方案,请告诉我.
我是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>创建一个实例并使用我嵌套容器中的注入类型?
我想确定每个请求结束后,structuremap是否会处理我的DataContext.
这是我的设置
ForRequestedType<MyDataContext>().TheDefault.Is.OfConcreteType<MyDataContext>();
SelectConstructor<MyDataContext>(() => new MyDataContext());
Run Code Online (Sandbox Code Playgroud)
结构图会自动处理我的datacontext还是我需要手动调用Dispose?
我正在使用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) http://docs.structuremap.net/似乎有很多使用已弃用成员的旧示例.有没有一个地方可以找到最新的StructureMap doco?
我有一个非常奇怪的问题 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) 所以我从头开始构建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 ×10
asp.net-mvc ×3
.net ×2
c# ×2
nhibernate ×2
automapper ×1
bdd ×1
dispose ×1
moq ×1
quartz.net ×1
specflow ×1
unit-testing ×1