我知道类似的问题被问了几次(例如: 这里 , 这里 , 这里和这里 ),但它是以前版本的Unity,答案取决于使用的LifetimeManager类。 文档说: Unity使用从LifetimeManager基类inheritance的特定types(统称为生存期pipe理器)来控制它如何存储对对象实例的引用以及容器如何处理这些实例。 好吧,听起来不错,所以我决定在生命周期pipe理中检查构build的实现。 我的结论是: TransientLifetimeManager – 不处理处理。 容器只能parsing实例,并不会跟踪它。 调用代码负责处理实例。 ContainerControlledLifetimeManager – configuration生命期pipe理器时的实例(=configuration容器时)。 提供hiearchy中所有容器共享的单例实例。 HierarchicalLifetimeManager – 从ContainerControlledLifetimeManager派生行为。 它在hiearchy(子容器)中为每个容器提供“单例”实例。 ExternallyControlledLifetimeManager – 不处理处理。 正确的行为,因为容器不是实例的所有者。 PerResolveLifetimeManager – 不处理处理。 它通常与TransientLifetimeManager相同,但它允许在parsing整个对象图时重用dependency injection的实例。 PerThreadLifetimeManager – 不处理MSDN中描述的处理。 谁负责处理? 内置PerThreadLifetimeManager是: public class PerThreadLifetimeManager : LifetimeManager { private readonly Guid key = Guid.NewGuid(); [ThreadStatic] private static Dictionary<Guid, object> […]
我现在已经有些过时了,现在有兴趣听听人们对Prism最新版本的看法(我之前使用过几个版本),还是MVVM Light + Unity方法(我从来没有这样做过 – 体面的例子url会很好)。 我的项目将是由多个开发人员编写的包含多个模块的大型项目。 也有资金来引入第三方控制套件,以build立一个漂亮的工作空间使用一个漂亮的Docking / Workspace布局pipe理器(我知道一些比其他人更好地发挥Prism区域)。 如果你现在从头开始一个项目,你会怎么做,为什么? 有关具体build议的体系结构模式的详细信息将会很有用(例如,自动发现模块DLL?注入日志logging服务?)。 基本上,任何想法和build议都会很好。 我想讨论一下。 也许你会build议进入另一个方向吗? 我非常在研究阶段,并希望尽可能多的input。 我把这个放在这里是因为我认为它会比Prism / MVVM Light论坛的偏见less一些,但如果这个问题有更合适的地方,请指出我的方向。
我终于用C#围绕IoC和DI进行了包围,并且正在挣扎着一些边缘。 我正在使用Unity容器,但我认为这个问题更广泛地适用。 使用一个IoC容器来分配实现IDisposable的实例让我大吃一惊! 你怎么知道你应该Dispose()? 实例可能是为你创build的(因此你应该Dispose()它),或者它可能是一个实例的生命周期在其他地方pipe理(因此你最好不要)。 代码中没有任何内容告诉你,实际上这可能会根据configuration而改变! 这对我来说似乎是致命的。 任何IoC专家都可以描述处理这种歧义的好方法吗?
前几天我用ASP.Net线程有这个问题。 我想每个Web请求有一个单例对象。 我实际上需要这个工作单位。 我想为每个Web请求实例化一个工作单元,以便通过请求标识映射是有效的。 这样我就可以使用IoC将我自己的IUnitOfWork透明地注入到我的存储库类中,并且可以使用同一个实例来查询并更新我的实体。 由于我使用Unity,我错误地使用了PerThreadLifeTimeManager。 我很快意识到,ASP.Net线程模型不支持我想要的。 基本上它使用一个theadpool和回收线程,这意味着我得到一个UnitOfWork每个线程! 但是,我想要的是每个Web请求的一个工作单元。 有一点使用Google给了我这个伟大的职位 。 那正是我想要的; 除了很容易达到的统一部分。 这是我实现PerCallContextLifeTimeManager为统一: public class PerCallContextLifeTimeManager : LifetimeManager { private const string Key = "SingletonPerCallContext"; public override object GetValue() { return CallContext.GetData(Key); } public override void SetValue(object newValue) { CallContext.SetData(Key, newValue); } public override void RemoveValue() { } } 当然,我用这个来注册我的工作单位,代码如下: unityContainer .RegisterType<IUnitOfWork, MyDataContext>( new […]
我使用Unity进行dependency injection,并使用Identiy Provider来pipe理用户login,注册,电子邮件确认等。 当我尝试注册一个用户,我有这个问题: 当前typesMicrosoft.Owin.Security.IAuthenticationManager是一个接口,无法构build。 你是否缺less一个types映射? 我不知道如何在我的Unity容器中注册这个接口(IAuthenticationManager)。 我试着用这个代码注册接口,但如果我把它,我有其他问题: 没有IUserTokenProvider注册。 container.RegisterType<HttpContextBase>( new InjectionFactory(_ => new HttpContextWrapper(HttpContext.Current))); container.RegisterType<IOwinContext>(new InjectionFactory(c => c.Resolve<HttpContextBase>().GetOwinContext())); container.RegisterType<IAuthenticationManager>( new InjectionFactory(c => c.Resolve<IOwinContext>().Authentication)); 我把应用程序的一些代码(如果我不使用统一,一切工作正常): 的AccountController private IAuthenticationManager AuthenticationManager { get { return HttpContext.GetOwinContext().Authentication; } } IdentityConfig.cs public class ApplicationUserManager : UserManager<ApplicationUser> { public ApplicationUserManager(IUserStore<ApplicationUser> store) : base(store) { } public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, […]
我趾高气昂地使用IoC框架,并select使用Unity。 我仍然不能完全理解的一件事是如何更深入地parsing应用程序中的对象。 我怀疑我刚才没有弄清灯泡。 所以我想在伪代码中做如下的事情 void Workflow(IUnityContatiner contatiner, XPathNavigator someXml) { testSuiteParser = container.Resolve<ITestSuiteParser> TestSuite testSuite = testSuiteParser.Parse(SomeXml) // Do some mind blowing stuff here } 所以testSuiteParser.Parse执行以下操作 TestSuite Parse(XPathNavigator someXml) { TestStuite testSuite = ??? // I want to get this from my Unity Container List<XPathNavigator> aListOfNodes = DoSomeThingToGetNodes(someXml) foreach (XPathNavigator blah in aListOfNodes) { //EDIT […]
我有一个MVC 3的Web应用程序,我正在使用entity framework的数据访问。 此外,我已经简单地使用了存储库模式,例如所有与产品相关的东西都在“ProductRepository”中处理,所有与User相关的东西都在“UserRepository”中处理。 因此,我使用UNITY容器来创build一个DataContext的单例实例,我将其注入到每个存储库中。 在Google上快速search,每个人都build议你不要使用DataContext的单例实例,因为它可能会在未来给你一些内存泄漏。 所以,受这篇文章的启发,为每个Web请求创build一个DataContext的单例实例就是答案(如果我错了,请纠正我的错误!) http://blogs.microsoft.co.il/blogs/gilf/archive/2010/05/18/how-to-manage-objectcontext-per-request-in-asp-net.aspx 但是,UNITY不支持“每个networking请求”终身pipe理器。 但是,可以实现自己的自定义生命期pipe理器,它可以为您处理。 实际上,这是在这篇文章中讨论: Singleton每呼叫上下文(Web请求)在Unity 问题是,现在我已经实现了上述职位描述的自定义生存期pipe理器,但是我不确定这是否可以这样做。 我也想知道datacontext实例在提供的解决scheme中的位置? 我错过了什么吗? 有没有更好的办法来解决我的“问题”? 谢谢! **添加了关于我的实现的信息** 以下是我的Global.asax,Controller和Repository中的代码片断。 这清楚地表明了我的实施情况。 Global.asax中 var container = new UnityContainer(); container .RegisterType<ProductsRepository>(new ContainerControlledLifetimeManager()) .RegisterType<CategoryRepository>(new ContainerControlledLifetimeManager()) .RegisterType<MyEntities>(new PerResolveLifetimeManager(), dbConnectionString) 调节器 private ProductsRepository _productsRepository; private CategoryRepository _categoryRepository; public ProductsController(ProductsRepository productsRepository, CategoryRepository categoryRepository) { _productsRepository = productsRepository; _categoryRepository = categoryRepository; } public […]
我刚开始学习DI(我正在WPF / Silverlight上工作,但是我有一个转移到ASP.NET的计划)。 在我从互联网上读到一些DI文章后,我有两个框架,MEF和Unity。 我想知道他们之间的真实世界有什么不同,哪一个是好的。
在跟随Krzysztof的声明 , 温莎做了比其他IoC更多,我想了解这些IoC的相互堆叠和城堡温莎提供的好处/额外设施。 有比较吗? 有人可以帮助我了解Castle Windsor提供的其他IoCfunction吗?
在尝试学习Unity时 ,我一直看到下面的代码来覆盖MVC中的GetControllerInstance : if(!typeof(IController).IsAssignableFrom(controllerType)) { … } 这似乎是一个基本写作的非常复杂的方式 if(controllerType is IController) { … } 我很欣赏is和IsAssignableFrom之间的细微差别,即IsAssignableFrom不包括IsAssignableFrom转换,但是我正努力去理解这种差异在实际场景中的含义。 什么时候selectIsAssignableFrom over is IsAssignableFrom is ? 在GetControllerExample会有什么不同? if (!typeof(IController).IsAssignableFrom(controllerType)) throw new ArgumentException(…); return _container.Resolve(controllerType) as IController;