标签: structuremap

使用StructureMap配置配置文件

重要的 ; 我真的StructureMap这里寻找答案.请不要说如何与温莎,春天,团结,或任何这样做的人.

我正在玩StructureMapIoC - 基本上我的目标是拥有一个定义核心类型的"默认"配置文件,以及一些覆盖/扩展它的命名配置文件.我认为配置文件可以做到这一点,但我无法通过xml或代码API使其工作.特别是,如果我尝试为配置文件加载容器:

container = new Container();
container.SetDefaultsToProfile(profile);
Run Code Online (Sandbox Code Playgroud)

然后我得到"请求的个人资料{name}无法找到",尽管事实上我已经明确地调用CreateProfile了初始化(使用该名称).

我吠叫错了树吗?

(也发布到用户组)


我理想的是能够定义标准(/默认)类型,然后对于一系列不同的命名配置,覆盖一些设置 - 即如果我有

  • global:IFoo=> Foo,IBar=>Bar
  • configA :(没有变化)
  • configB:IFoo=>SpecialFoo

我相信这可以映射到2个容器,使用命名的配置文件加载.目的是,如果我要求任何一个容器IBar,我得到一个 Bar- 但是configA返回一个Foo(for IFoo),其中 - 如同configB返回一个 SpecialFoo.

有人能告诉我如何配置这个吗?无论是xml还是代码都很好......我只是想让它起作用.我只需要接口到具体类型的映射(没有特殊的配置/属性设置).

.net structuremap configuration

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

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,NHibernate和多个数据库

我正在使用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)

这一切都适用于单个数据库和单个会话工厂.但是应用程序使用多个数据库.

处理这个问题的最佳方法是什么?

structuremap nhibernate asp.net-mvc inversion-of-control

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

其中Simple Injector等效于StructureMap的ObjectFactory

我正在ASP.NET MVC3应用程序中从StructureMap迁移到Simple Injector.

我正在使用控制器DI的MVC3扩展,但我遇到了尝试替换StructureMap的静态方面的问题.我们有电话

StructureMap.ObjectFactory.GetInstance<Interface>()
Run Code Online (Sandbox Code Playgroud)

在应用程序的不同层.它看起来不像Simple Injector有办法做到这一点.

我错过了什么吗?或者Simple Injector不适用于我的应用程序?

请提前告知并提前致谢.

structuremap asp.net-mvc asp.net-mvc-3 simple-injector

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

结构图Web Api 2帐户控制器和个人帐户

我非常喜欢IOC和web-api 2,但是我已经在我的web-api 2中使用了StructureMap来处理我自己的控制器.我没有管理的是使用个人帐户在AccountController上使用StructureMap.我使用AccountController开箱即用,到目前为止我所管理的是:

  1. 在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"

c# structuremap owin asp.net-web-api2

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

Automapper和StructureMap正确的实例注册.net核心

目前,这是我使用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连接它的正确方法是什么?

c# structuremap automapper

7
推荐指数
0
解决办法
668
查看次数

结构图范围/生命周期指导?

有没有理由从默认范围(瞬态?)切换到其他东西,除了需要为功能原因控制范围(例如Singleton)?

如果我坚持使用默认范围,每个插件类型的每个默认实例都将在每个请求(假设是一个Web应用程序)上实际实例化,这是正确的吗?这会明显影响性能吗?

我已经考虑过使用Http Session范围来限制每个登录用户的一个实例.但是,这将导致(至少)每个插件类型的一个实例始终存储在内存中.使用默认范围,这些实例仅在处理页面请求时保留在内存中.我不确定哪个更好.

如果您使用StructureMap,您通常如何为每个插件类型配置范围?

感谢您的任何见解,

菲尔

c# structuremap inversion-of-control

6
推荐指数
1
解决办法
2618
查看次数

如何使用现有实例选择要在IoC容器中创建的类型

这可能只是一个新手问题,但我有以下几点:

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)

c# structuremap ninject ioc-container autofac

6
推荐指数
2
解决办法
1584
查看次数

StructureMap错误:没有为PluginFamily定义默认实例

对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

6
推荐指数
1
解决办法
2万
查看次数

尝试访问dbcontext时获取httpContext是null错误

我们有一个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 httpcontext dbcontext

6
推荐指数
0
解决办法
440
查看次数