重要的 ; 我真的在StructureMap这里寻找答案.请不要说如何与温莎,春天,团结,或任何这样做的人.
我正在玩StructureMapIoC - 基本上我的目标是拥有一个定义核心类型的"默认"配置文件,以及一些覆盖/扩展它的命名配置文件.我认为配置文件可以做到这一点,但我无法通过xml或代码API使其工作.特别是,如果我尝试为配置文件加载容器:
container = new Container();
container.SetDefaultsToProfile(profile);
Run Code Online (Sandbox Code Playgroud)
然后我得到"请求的个人资料{name}无法找到",尽管事实上我已经明确地调用CreateProfile了初始化(使用该名称).
我吠叫错了树吗?
(也发布到用户组)
我理想的是能够定义标准(/默认)类型,然后对于一系列不同的命名配置,覆盖一些设置 - 即如果我有
IFoo=> Foo,IBar=>Bar IFoo=>SpecialFoo 我相信这可以映射到2个容器,使用命名的配置文件加载.目的是,如果我要求任何一个容器IBar,我得到一个
Bar- 但是configA返回一个Foo(for IFoo),其中 - 如同configB返回一个
SpecialFoo.
有人能告诉我如何配置这个吗?无论是xml还是代码都很好......我只是想让它起作用.我只需要接口到具体类型的映射(没有特殊的配置/属性设置).
[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请求和石英作业.如果您有更好/更容易/更简单的解决方案,请告诉我.
我正在使用Fluent NHibernate开发Asp.Net MVC 3应用程序.我只是尝试使用StructureMap添加IoC容器.
我已经实现了一个自定义控制器工厂,它使用StructureMap来创建控制器并注入依赖项.每个控制器构造函数都接受一个或多个服务,而这些服务又将DAO作为构造函数参数.每个DAO构造函数都使用一个ISessionFactory.
对于我的StructureMap NHibernate注册表,我有以下内容:
internal class NHibernateRegistry : Registry
{
public NHibernateRegistry()
{
var connectionString = ConfigurationManager.ConnectionStrings["AppDb"].ConnectionString;
For<ISessionFactory>()
.Singleton()
.Use(x => new AppSessionFactory().GetSessionFactory(connectionString));
For<ISession>()
.HybridHttpOrThreadLocalScoped()
.Use(x => x.GetInstance<ISessionFactory>().OpenSession());
}
}
public class AppSessionFactory
{
public ISessionFactory GetSessionFactory(string connectionString)
{
return GetConfig(connectionString)
.BuildSessionFactory();
}
public static FluentConfiguration GetConfig(string connectionString)
{
return Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2005.ConnectionString(x => x.Is(connectionString)))
.Mappings(
x => x.FluentMappings.AddFromAssemblyOf<AppEntity>());
}
}
Run Code Online (Sandbox Code Playgroud)
这一切都适用于单个数据库和单个会话工厂.但是应用程序使用多个数据库.
处理这个问题的最佳方法是什么?
我正在ASP.NET MVC3应用程序中从StructureMap迁移到Simple Injector.
我正在使用控制器DI的MVC3扩展,但我遇到了尝试替换StructureMap的静态方面的问题.我们有电话
StructureMap.ObjectFactory.GetInstance<Interface>()
Run Code Online (Sandbox Code Playgroud)
在应用程序的不同层.它看起来不像Simple Injector有办法做到这一点.
我错过了什么吗?或者Simple Injector不适用于我的应用程序?
请提前告知并提前致谢.
我非常喜欢IOC和web-api 2,但是我已经在我的web-api 2中使用了StructureMap来处理我自己的控制器.我没有管理的是使用个人帐户在AccountController上使用StructureMap.我使用AccountController开箱即用,到目前为止我所管理的是:
在Ioc.cs中我添加了以下内容(由于错误)
x.For<IUserStore<ApplicationUser>>().Use<UserStore<ApplicationUser>>();
x.For<DbContext>().Use(() => new ApplicationDbContext());
x.For<ISecureDataFormat<AuthenticationTicket>()
.Use<SecureDataFormat<AuthenticationTicket>>();
Run Code Online (Sandbox Code Playgroud)但是现在我遇到了这个错误:
"没有注册默认实例,无法自动确定类型IDataSerializer <AuthenticationTicket>"
我真的不知道该怎么做.我试图找到IDataSerializer的详细实例,但没有运气.
顺便说一句......我已经安装了Nuget包"Structuremap.webapi2"
目前,这是我使用StructureMap连接自动映射器的IMapper实例的方式.
public class DefaultRegistry : Registry
{
public DefaultRegistry()
{
Scan(o =>
{
o.AddAllTypesOf<Profile>();
});
For<IMapper>().Use(() => Mapper.Instance);
}
}
Run Code Online (Sandbox Code Playgroud)
在网络核心创业中:
var container = new Container(new DefaultRegistry());
container.Populate(services);
services.AddAutoMapper(cfg => cfg.ConstructServicesUsing(container.GetInstance));
Mapper.AssertConfigurationIsValid();
Run Code Online (Sandbox Code Playgroud)
由于Mapper.Instance创建静态,如何将其注册为实例?或者使用StructureMap连接它的正确方法是什么?
有没有理由从默认范围(瞬态?)切换到其他东西,除了需要为功能原因控制范围(例如Singleton)?
如果我坚持使用默认范围,每个插件类型的每个默认实例都将在每个请求(假设是一个Web应用程序)上实际实例化,这是正确的吗?这会明显影响性能吗?
我已经考虑过使用Http Session范围来限制每个登录用户的一个实例.但是,这将导致(至少)每个插件类型的一个实例始终存储在内存中.使用默认范围,这些实例仅在处理页面请求时保留在内存中.我不确定哪个更好.
如果您使用StructureMap,您通常如何为每个插件类型配置范围?
感谢您的任何见解,
菲尔
这可能只是一个新手问题,但我有以下几点:
public class FooSettings {}
public class BarSettings {}
public class DohSettings {}
// There might be many more settings types...
public interface IProcessor { ... }
public class FooProcessor
: IProcessor
{
public FooProcessor(FooSettings) { ... }
}
public class BarProcessor
: IProcessor
{
public BarProcessor(BarSettings) { ... }
}
public class DohProcessor
: IProcessor
{
public DohProcessor(DohSettings) { ... }
}
// There might be many more processor types with matching settings...
public interface IProcessorConsumer {}
public class …Run Code Online (Sandbox Code Playgroud) 对Structure-Map来说很新.试图弄清楚它是如何工作的,我怎样才能从中受益.
到目前为止我有这个..
的Global.asax.cs:
IContainer container = new Container(x =>
{
x.For<IControllerActivator>().Use
<StructureMapControllerActivator>();
x.For<IUserRepo>().Use<UserRepo>();
});
DependencyResolver.SetResolver(new StructureMapDependencyResolver(container));
Run Code Online (Sandbox Code Playgroud)
StructureMapControllerActivator:
public class StructureMapControllerActivator : IControllerActivator
{
private readonly IContainer _container;
public StructureMapControllerActivator(IContainer container )
{
this._container = container;
}
public IController Create(RequestContext requestContext, Type controllerType)
{
return _container.GetInstance(controllerType) as IController;
}
}
Run Code Online (Sandbox Code Playgroud)
StructreMapDependencyResolver:
private readonly IContainer _container;
public StructureMapDependencyResolver(IContainer container )
{
this._container = container;
}
public object GetService(Type serviceType)
{
object instance = _container.TryGetInstance(serviceType);
if(instance == null && !serviceType.IsAbstract)
{
_container.Configure(c => …Run Code Online (Sandbox Code Playgroud) c# structuremap asp.net-mvc dependency-injection asp.net-mvc-3
我们有一个MVC 4项目,并使用Structure Map作为IoC框架.当我们对使用DbContext的服务类进行异步调用时,它会抛出异常:
Value cannot be null.
Parameter name: httpContext
Exception Details: System.ArgumentNullException: Value cannot be null.
Parameter name: httpContext
Run Code Online (Sandbox Code Playgroud)
一旦抛出这个:
The operation cannot be completed because the DbContext has been disposed.
Run Code Online (Sandbox Code Playgroud)
我怎么能纠正这个?
structuremap ×10
c# ×5
asp.net-mvc ×3
.net ×2
nhibernate ×2
autofac ×1
automapper ×1
dbcontext ×1
httpcontext ×1
ninject ×1
owin ×1
quartz.net ×1