在跟进基耶斯洛夫的说法是温莎确实比其他国际奥委会的多很多,我想了解这些国际奥委会如何叠起来反对对方,这温莎城堡带来的好处/附加设施.
有比较吗?有人可以帮助我理解Castle Windsor提供的其他IoC附加功能
structuremap dependency-injection castle-windsor ioc-container unity-container
我一直在搜索依赖注入并阅读一些文章.但我仍然无法找出MEF和其他IoC之间的区别.所以,我的问题是:在哪种情况下,我更喜欢使用MEF还是IoC容器?
为什么在PRRE(WPF和Silverlight)或桌面应用程序中使用MEF是好的?
而在Web应用程序中,人们使用IoC容器.
那么,决定使用哪种依赖技术的标准是什么?
我浏览过文章http://devlicio.us/blogs/casey/archive/2009/12/18/what-is-the-difference-between-an-ioc-container-and-mef.aspx ,但我无法确定任何事情.
structuremap dependency-injection mef ioc-container inversion-of-control
我在我的DI中使用StructureMap.想象一下,我有一个类需要1个参数:
public class ProductProvider : IProductProvider
{
public ProductProvider(string connectionString)
{
....
}
}
Run Code Online (Sandbox Code Playgroud)
当我得到IProductProvider的实例时,我需要在运行时指定"connectionString" .
我已经按如下方式配置了StructureMap:
ForRequestedType<IProductProvider>.TheDefault.Is.OfConcreteType<ProductProvider>().
WithCtorArgument("connectionString");
Run Code Online (Sandbox Code Playgroud)
但是,我不想在这里调用EqualTo("something ......")方法,因为我需要一些工具来在运行时动态指定此值.
我的问题是:如何通过使用ObjectFactory获取IProductProvider的实例?
目前,我有类似的东西:
ObjectFactory.GetInstance<IProductProvider>();
Run Code Online (Sandbox Code Playgroud)
但是如你所知,这不起作用......
任何建议将不胜感激.
我有两个需要的服务XPathDocument.我希望能够定义XPathDocumnet在两个服务的配置中使用的命名实例.我也希望能够告诉StuctureMap使用哪个构造函数XPathDocument.当我尝试获取XPathDocument它的实例时告诉我它无法找到插件类型XmlReader.我想使用需要字符串uri的构造函数来获取xml文件.我似乎无法让这个工作.这是StructureMap配置代码.
public class Service1 : IService1 {
public Service1(XPathDocument document) {}
}
public class Service2 : IService2 {
public Service2(XPathDocument document) {}
}
public class Registry1 : Registry {
ForRequestedType<IService1>().TheDefault.Is.OfConcreteType<Service1>()
.CtorDependency<XPathDocument>()
.Is(x => x.TheInstanceNamed("XPathDocument1"));
ForRequestedType<IService2>().TheDefault.Is.OfConcreteType<Service2>()
.CtorDependency<XPathDocument>()
.Is(x => x.TheInstanceNamed("XPathDocument2"));
ForRequestedType<XPathDocument>().AddInstances(x => {
x.OfConcreteType<XPathDocument>()
.WithCtorArg("uri").EqualToAppSetting("XmlFile1")
.WithName("XPathDocument1");
x.OfConcreteType<XPathDocument>()
.WithCtorArg("uri").EqualToAppSetting("XmlFile2")
.WithName("XPathDocument2");
});
}
Run Code Online (Sandbox Code Playgroud) 在各种Stack Overflow问题和博客文章之间,有关于开放式泛型和StructureMap主题的相当多的文档.不幸的是,我必须遗漏一些东西,因为我尝试使用scan执行配置以及具有"贪婪"构造函数的类实现仍然有效.
我希望StructureMap通过对其实现的接口的引用来获取下面的类的实例.ToCsvService存在于名为Infrastructure的未引用程序集中.IToCsvService存在于名为Core的引用程序集中.你可以看到
ToCsvService有一个"贪婪"的构造函数.
public class ToCsvService<TSource> : IToCsvService<TSource>
{
public ToCsvService(ICollection<TSource> collection)
{
}
}
Run Code Online (Sandbox Code Playgroud)
我让StructureMap ToCsvService通过这个ConnectImplementationsToTypesClosing方法了解.
ObjectFactory.Initialize(cfg =>
{
cfg.Scan(scan =>
{
scan.Assembly("Infrastructure");
scan.WithDefaultConventions();
// even with this call StructureMap cannot use ToCsvService
// instance of IToCsvService (though wouldn't expect it to)
scan.ConnectImplementationsToTypesClosing
(typeof(IToCsvService<>));
});
});
Run Code Online (Sandbox Code Playgroud)
从ObjectFactory.WhatDoIHave()方法看,StructureMap知道ToCsvService.
PluginType Name Description
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
IToCsvService`1 (IToCsvService`1)
Scoped as: Transient
6202a7ee-89a4-4edd-831d-4867b7dd1a7e Configured Instance of Infrastructure.Services.ToCsvService`1, Infrastructure, Version=1.0.0.0, Culture=neutral, … public interface IInterface1
{
}
public interface IInterface2
{
}
public class MyClass : IInterface1, IInterface2
{
}
...
ObjectFactory.Initialize(x =>
{
x.For<IInterface1>().Singleton().Use<MyClass>();
x.For<IInterface2>().Singleton().Use<MyClass>();
});
var x = ObjectFactory.GetInstance<IInterface1>();
var y = ObjectFactory.GetInstance<IInterface2>();
Run Code Online (Sandbox Code Playgroud)
我用上面的代码得到了两个不同的MyClass实例.我该怎么办?
如何使用Settings(ApplicationSettingsBase)和依赖注入将所有配置文件代码保留在逻辑代码之外?
配置我指的是客户特定的配置文件.
我是否真的必须每次需要时注入一个配置类,还是有其他模式?
获得一些示例代码会很棒!
样品:
静态配置:
public static class StaticConfiguration
{
public static bool ShouldApplySpecialLogic { get; set; }
public static string SupportedFileMask { get; set; }
}
public class ConsumerOfStaticConfiguration
{
public void Process()
{
if (StaticConfiguration.ShouldApplySpecialLogic)
{
var strings = StaticConfiguration.SupportedFileMask.Split(',');
foreach (var @string in strings)
{
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
非静态配置:
public interface IConfiguration
{
bool ShouldApplySpecialLogic { get; set; }
string SupportedFileMask { get; set; }
}
public class Configuration : IConfiguration
{
public bool ShouldApplySpecialLogic …Run Code Online (Sandbox Code Playgroud) c# structuremap configuration dependency-injection application-settings
当与StructureMap实施DI中的WebAPI,我们使用了ServiceActivator中发现的
public class ServiceActivator : IHttpControllerActivator
{
public ServiceActivator(HttpConfiguration configuration) {}
public IHttpController Create(HttpRequestMessage request,
HttpControllerDescriptor controllerDescriptor, Type controllerType)
{
var controller = ObjectFactory.GetInstance(controllerType) as IHttpController;
return controller;
}
}
Run Code Online (Sandbox Code Playgroud)
但现在使用新的StructureMap,我的ReSharper建议:
类'StructureMap.ObjectFactory'已过时:ObjectFactory将在StructureMap的未来4.0版本中删除.支持使用Container类进行以后的工作
intellisense Container给了我非常有限的信息.
我们应该如何使用Container类重写ServiceActivator?
我正在创建一个ASP.NET Web API 2.1站点,因为我想将依赖项直接注入控制器,所以我创建了自己的IDependencyResolver实现,以便StructureMap为我处理.
public class StructureMapDependencyResolver : IDependencyResolver
{
public IDependencyScope BeginScope()
{
return this;
}
public object GetService(Type serviceType)
{
return ObjectFactory.GetInstance(serviceType);
}
public IEnumerable<object> GetServices(Type serviceType)
{
return ObjectFactory.GetAllInstances(serviceType).Cast<object>();
}
public void Dispose()
{
}
}
Run Code Online (Sandbox Code Playgroud)
然后,我通过将此行添加到Global.asax中的Application_Start方法,告诉Web API使用此类
GlobalConfiguration.Configuration.DependencyResolver = new StructureMapDependencyResolver();
Run Code Online (Sandbox Code Playgroud)
编译,但当我尝试访问浏览器中的任何API方法时,我得到了这样的错误
No Default Instance defined for PluginFamily System.Web.Http.Hosting.IHostBufferPolicySelector, System.Web.Http
Run Code Online (Sandbox Code Playgroud)
当我在StructureMap配置中添加一行时,那个相对容易解决
this.For<IHostBufferPolicySelector>().Use<WebHostBufferPolicySelector>();
Run Code Online (Sandbox Code Playgroud)
然而,我得到了其他System.Web.Http类的其他类似错误,虽然我可以解决其中的一些,但我仍然坚持如何处理其中的3个,即ITraceManager,IExceptionHandler和IContentNegotiator.
问题是TraceManager似乎是ITraceManager的默认实现,是一个内部类,所以我不能在我的StructureMap配置中引用它.
那么我是以完全错误的方式进行此操作还是有其他方法来注入这些内部类?
我最近尝试使用StructureMap实现依赖注入.我设法一直遵循示例,但每次尝试运行应用程序时都会遇到抛出的异常.这是我的控制器工厂的一些代码片段.
public class StructureMapControllerFactory : DefaultControllerFactory
{
protected override IController GetControllerInstance(Type controllerType)
{
if (controllerType == null)
throw new ArgumentNullException("controllerType");
return ObjectFactory.GetInstance(controllerType) as Controller;
}
}
Run Code Online (Sandbox Code Playgroud)
我的Global.asax调用一个静态的BootStrapper类来注册我的所有依赖项,但它看起来像StructureMapControllerFactory的GetControllerInstance被调用两次.第一次调用时,会传入一个正确的controllerType,但在第二次调用时它始终为null.
第一次调用GetControllerInstance时,类型设置为HomeController,这是正确的.在HomeController中触发的代码,它返回View().在返回View()时,在aspx文件上调用Page_Load事件.单步执行后,它会到达一条线:
httpHandler.ProcessRequest(HttpContext.Current);
这就是第二次调用GetControllerInstance的地方.
这是我的Global.asax位可能是相关的:
protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
Bootstrapper.ConfigureStructureMap();
ControllerBuilder.Current.SetControllerFactory(new StructureMapControllerFactory());
}
Run Code Online (Sandbox Code Playgroud)
我非常渴望让依赖注入工作,如果有人能帮助我,我会非常感激.:)
structuremap ×10
c# ×4
asp.net-mvc ×2
asp.net ×1
constructor ×1
generics ×1
mef ×1
singleton ×1
xmlreader ×1