我正在使用像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页面?
提前干杯
有没有办法确定StructureMap中是否配置了特定类型?
如果没有在StructureMap中专门配置,我想返回泛型类型.
我正在尝试使用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,我得到错误没有为此对象定义无参数构造函数.
我错过了什么?
我正在将一个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抱怨所有这些接口没有在容器中配置.
我有一个场景,我有两个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中使用时,其他地方应该使用我的未命名实例.
我做错了什么?
我有很多实现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)
我在行中遇到编译错误 …
我想使用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) 在关于生命周期的StructureMap文档中,他们声明一个作用域选项是HttpSession,并且它:"将实例缓存在HttpContext.Session集合中.请谨慎使用."
我不知道要小心谨慎,而且我的google-fu让我失望了.
我们使用的用例是我们要缓存一些昂贵的Web服务调用.其中一些是无国籍的,但其中一些与特定用户有关.
如果我们注入会话范围,我们什么时候不好,顽皮的人?我们需要防范什么?
我在StructureMap 4.0中遇到问题。在使用StructureMap 3.0时,我使用ObjectFactory来配置所有实例,并且很容易通过解决方案内部任何地方的自己的接口来获取实例。例如:
在global.cs上,我声明如下:ObjectFactory.Initialize(x => {x.For()。Use();}
在另一个类(例如Family.cs)上,很容易获得Peson的实例:var person = ObjectFactory.GetInstance();
但是,将StructureMap更新到4.0后,我遇到了问题。它使用Container而不是ObjectFactory,我找不到任何获取现有容器的方法。我的意思是这段代码是错误的var person = container.GetInstance();
如果我在Global.cs中将Container声明为静态变量,则可以从Family.cs类中访问它。我不喜欢这样 我希望通过获取在global.cs中声明的现有容器来像ObjectFactory一样工作,但是我不知道该怎么做。
所以,
// 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,IReadSomething而IWriteSomethingClass只是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还是什么?
我也使用结构图作为我的主要依赖项解析 - 所以使用它的答案很好.
structuremap ×10
c# ×5
.net ×3
asp.net-mvc ×2
.net-core ×1
asp.net-core ×1
interface ×1
nhibernate ×1