标签: structuremap

无效控制器时的StructureMap错误

我正在使用像Rob Conery那样的MVC店面的结构图,我有一个AdminController,所以我只需输入:

website/Admin/action
Run Code Online (Sandbox Code Playgroud)

但如果我拼错控制器名称,我会收到以下错误:

异常详细信息:System.ArgumentNullException:Value不能为null.参数名称:key

此行发生错误:

Controller controller = ObjectFactory.GetInstance(controllerType) as Controller;
Run Code Online (Sandbox Code Playgroud)

有没有人对我如何处理这个错误有任何想法,或者根本不允许它发生,也许只是转到404页面?

提前干杯

c# structuremap asp.net-mvc

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

确定StructureMap是否配置了特定类型?

有没有办法确定StructureMap中是否配置了特定类型?

如果没有在StructureMap中专门配置,我想返回泛型类型.

structuremap

4
推荐指数
1
解决办法
1106
查看次数

ASP.NET MVC,MVCContrib,Structuremap,让它作为controllerfactory工作?

我正在尝试使用structuremap来正确创建我的控制器,我正在使用DI将一个INewsService注入一个NewsController,这是我唯一的构造函数.

public class NewsController : Controller
{
    private readonly INewsService newsService;

    public NewsController(INewsService newsService)
    {
        this.newsService = newsService;
    }

    public ActionResult List()
    {
        var newsArticles = newsService.GetNews();
        return View(newsArticles);
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在使用此代码启动应用程序

public class Application : HttpApplication
{
    protected void Application_Start()
    {
        RegisterIoC();
        RegisterViewEngine(ViewEngines.Engines);
        RegisterRoutes(RouteTable.Routes);
    }

    public static void RegisterIoC()
    {
        ObjectFactory.Initialize(config => {
            config.UseDefaultStructureMapConfigFile = false;
            config.AddRegistry<PersistenceRegistry>();
            config.AddRegistry<DomainRegistry>();
            config.AddRegistry<ControllerRegistry>();
        });
        DependencyResolver.InitializeWith(new StructureMapDependencyResolver());
        ControllerBuilder.Current.SetControllerFactory(typeof(IoCControllerFactory));            
    }
}
Run Code Online (Sandbox Code Playgroud)

但Structuremap似乎不想注入INewsService,我得到错误没有为此对象定义无参数构造函数.

我错过了什么?

structuremap asp.net-mvc dependency-injection

4
推荐指数
1
解决办法
2676
查看次数

如何使用ASP.NET MVC 3 RTM配置依赖项注入

我正在将一个Web应用程序从ASP.NET 3 Preview 1升级到RTM,我对更新的依赖注入方法感到困惑.我正在使用StructureMap,但这与我的问题无关.以前我需要做的就是如下:

x.For<IControllerFactory>().Use<DefaultControllerFactory>();
x.For<IServiceLocator>().Use(MvcServiceLocator.Current);
Run Code Online (Sandbox Code Playgroud)

现在看来我需要提供IControllerActivator,IViewPageActivator和ModelMetadataProvider的实现,因为否则我从StructureMap收到错误,因为MVC尝试使用依赖项解析器来定位它们.从MVC源看,似乎没有公共默认实现.我在设置这些内容时遗漏了什么?当然这些应该按惯例配置?

需要配置什么以及如何使用StructureMap的例子.作为参考,我目前使用以下丑陋的kludge迫使MVC使用其内部默认值:

x.For<IControllerFactory>().Use<DefaultControllerFactory>();
x.For<IDependencyResolver>().Use(() => DependencyResolver.Current);                
x.For<IControllerActivator>().Use(() => null);
x.For<IViewPageActivator>().Use(() => null);
x.For<ModelMetadataProvider>().Use(ModelMetadataProviders.Current);
Run Code Online (Sandbox Code Playgroud)

编辑:为了清楚我有一个工作的依赖性解析器的StructureMap实现 - 问题是为什么MVC抱怨所有这些接口没有在容器中配置.

structuremap dependency-injection asp.net-mvc-3

4
推荐指数
1
解决办法
4292
查看次数

StructureMap中命名的单例实例(多个nHibernate会话工厂)

我有一个场景,我有两个Nhibernate SessionFactorys我需要注册一个使用StructureMap.只有Foo需要mySessionFactory会话.

像这样:

For<ISessionFactory>().Singleton().Use(NHibernateConfiguration.GetDefaultSessionFactory());
For<ISession>().HybridHttpOrThreadLocalScoped().Use(x => x.GetInstance<ISessionFactory>().OpenSession());
For<ISessionFactory>().Singleton().Use(AnotherNHibernateConfiguration.GetDefaultSessionFactory).Named("mySessionFactory");
For<ISession>().HybridHttpOrThreadLocalScoped().Use(x => x.GetInstance<ISessionFactory>("mySessionFactory").OpenSession()).Named("mySession");

For<Foo>()
   .Use<Foo>()
   .Ctor<ISession>("session").Is(x => x.TheInstanceNamed("mySession"));
Run Code Online (Sandbox Code Playgroud)

问题是mySessionFactory现在在任何地方使用,当我只想在Foo中使用时,其他地方应该使用我的未命名实例.

我做错了什么?

structuremap nhibernate

4
推荐指数
1
解决办法
1145
查看次数

如何将对象转换为泛型类型?

我有很多实现IBuilder <>接口的类,如下所示

更新: 每个Model1,Model2 ...都继承自IModel

public class A : IBuilder<Model1>
{
     public Model1 Create(string param)
     {
         return new Model1();
     }
}
public class B : IBuilder<Model2>
{
     public Model2 Create(string param)
     {
          return new Model2();
     }
}
Run Code Online (Sandbox Code Playgroud)

我正在使用StructureMap来注册继承IBuilder <>的所有类

Scan(x =>
{
       x.TheCallingAssembly();
       x.AddAllTypesOf(typeof(IViewModelBuilder<>));                
});
Run Code Online (Sandbox Code Playgroud)

更新

现在,每次我需要获得一些模块的模型我都会调用Do函数

public IModel Do(Module module)
{
        //ModelSettings is taken from web.config  
        var builderType = Type.GetType(string.Format("{0}.{1}ModelBuilder,{2}", ModelSettings.Namespace, module.CodeName, ModelSettings.Assembly));
        var builder = ObjectFactory.GetInstance(t) as IViewModelBuilder<>;

        return builder.Create("");            
}
Run Code Online (Sandbox Code Playgroud)

我在行中遇到编译错误 …

.net c# structuremap

4
推荐指数
1
解决办法
2885
查看次数

StructureMap:具体类构造函数接受相同接口类型的多个参数

我想使用StructureMap ObjectFactory来处理我的WCF服务使用的类的实例化.虽然我有限的经验足以处理一个接口与实现它的单个类之间的简单1:1映射,但我遇到了构造函数接受同一接口的多个参数的障碍.

我认为通过为每个映射命名,我可以将多个具体类关联到同一个接口,但是如何告诉StructureMap用于第一个和第二个构造函数参数的映射?

这是我想要ObjectFactory为我处理的类:

public class MasterPolicy {
    public MasterPolicy(IPolicy alfaPolicy, IPolicy numericPolicy)
    {
        AlphaPolicy = alphaPolicy;
        NumericPolicy = numericPolicy;
    }

    public IPolicy AlphaPolicy {get; private set; }
    public IPolicy NumericPolicy {get; private set; }

    public bool IsValid(string s)
    {
         if (!AlphaPolicy.IsValid(s)) return false;
         if (!NumericPolicy.IsValid(s)) return false;
         return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

IPolicy接口由多个类实现:

public interface IPolicy
{
    bool IsValid(string s);
}

public class AlphaPolicy : IPolicy
{
    public bool IsValid(string s) { return true; }
}

public class NumericPolicy : …
Run Code Online (Sandbox Code Playgroud)

c# structuremap interface

4
推荐指数
1
解决办法
3208
查看次数

在Map中注入时,StructureMap会警告 - 为什么?

关于生命周期StructureMap文档中,他们声明一个作用域选项是HttpSession,并且它:"将实例缓存在HttpContext.Session集合中.请谨慎使用."

我不知道要小心谨慎,而且我的google-fu让我失望了.

我们使用的用例是我们要缓存一些昂贵的Web服务调用.其中一些是无国籍的,但其中一些与特定用户有关.

如果我们注入会话范围,我们什么时候不好,顽皮的人?我们需要防范什么?

.net structuremap session-state ioc-container asp.net-mvc-4

4
推荐指数
1
解决办法
869
查看次数

在StructureMap 4.0中获取现有容器

我在StructureMap 4.0中遇到问题。在使用StructureMap 3.0时,我使用ObjectFactory来配置所有实例,并且很容易通过解决方案内部任何地方的自己的接口来获取实例。例如:

  1. 在global.cs上,我声明如下:ObjectFactory.Initialize(x => {x.For()。Use();}

  2. 在另一个类(例如Family.cs)上,很容易获得Peson的实例:var person = ObjectFactory.GetInstance();

但是,将StructureMap更新到4.0后,我遇到了问题。它使用Container而不是ObjectFactory,我找不到任何获取现有容器的方法。我的意思是这段代码是错误的var person = container.GetInstance();

如果我在Global.cs中将Container声明为静态变量,则可以从Family.cs类中访问它。我不喜欢这样 我希望通过获取在global.cs中声明的现有容器来像ObjectFactory一样工作,但是我不知道该怎么做。

.net c# structuremap objectfactory

4
推荐指数
1
解决办法
2267
查看次数

AspNet Core Scoped依赖接口隔离

所以,

// this doesn't work or make sense
services.AddScoped<IReadSomething>(sp => new Something());
services.AddScoped<IWriteSomething>(sp => new Something());
Run Code Online (Sandbox Code Playgroud)

所以我有两个接口用于同一个Class,IReadSomethingIWriteSomethingClass只是Something.

它们需要作用域,因为它们将数据子集从HttpContext独立的"DTO"框架转移到任意框架.

它们都应该引用相同的实例Something,显然只是暴露了一些读取,而另一些只是暴露了一些写入操作.所以它被编写在Middleware管道中的某个地方 - 应用程序的其余部分可以只使用IReadSomething和读取数据,这样我们就可以减少意外的数据覆盖.

这样做,

services.AddScoped<IReadSomething, Something>();
services.AddScoped<IWriteSomething, Something>();
Run Code Online (Sandbox Code Playgroud)

没有意义,因为它应该为每个接口创建一个新实例.

我想让Interface Segregation和Scoped Dependency Resolution协同工作让我感到失望 - 我觉得我不得不担心ASP.NET Core Scoped Service Factory还是什么?

我也使用结构图作为我的主要依赖项解析 - 所以使用它的答案很好.

c# structuremap dependency-injection .net-core asp.net-core

4
推荐指数
1
解决办法
105
查看次数