Tag: inversion of control

Unity IoC用于动态解析程序集

我们使用统一作为IoC。 我们遇到了独特的问题。 我们创建了名为IPlugin的接口。 该接口在各种第三方供应商之间共享,以基于此接口开发自己的插件。 然后这些插件适合我们的系统。 供应商将提供他们的插件作为DLL。 我们想要的是,使用unity我们想要解析用IPlugin接口实现的所有程序集类型。 我开始知道这可以通过MEF导出属性实现,我想知道这是否可以通过Unity使用一些简短的扩展来实现。 我们的代码 Public interface IPlugin { Void ProcessData(); } Public class DataProcessor { Var pluginList = unityContainer.ResolveAssemblies() /* There is no such method in unity but what we want is scan all assemblies in bin folder and load all types which are inheriting from IPlugIn */ } 供应商的集会 […]

IoC – 多个实现支持单个接口

我想知道为什么.Net IoC容器不能轻易支持单个接口的多个实现! 可能是我错了,但就我所见,像Ninject这样的框架部分支持使用注释这个function( 如何? )。 我不认为像Windsor或简单注入器这样的其他框架有一个简单的机制来支持这种情况。 是否有任何理由不支持许多框架? AFAIK,使用接口的最重要原因之一是实现松散耦合。 如果框架旨在改善松耦合,不能流利地支持单个接口的多个实现,我不明白为什么! PS当然我理解在运行时会出现解决问题,容器会混淆选择哪种实现,但这是设计中必须考虑的事情,对吧?

DI和Singleton Pattern在一个实现中

我想使用Windsor IOC / DI框架重构一些代码,但我的问题是我有一些Singleton类和Factory模式类,我不确定是否可以使用DI实现Singleton或Factory。 有没有人有任何想法,如果有可能,怎么样?

如何使用简单的注入器,存储库和上下文 – 首先编码

我正在尝试使用Simple Injector来创建我的存储库并在业务逻辑层中使用它(我也想使用PerWebRequest方法)。 在DAL层我有: public interface IRepository where T : class { void Add(T entity); void Delete(T entity); void Delete(int id); void Update(T entity); T GetById(int Id); IQueryable All(); IEnumerable Find(Func predicate); } 并且: public class EFRepository : IRepository, IDisposable where T : class { #region Members protected DbContext Context { get; set; } protected DbSet […]

这是“混蛋注射反模式”的一个很好的例子吗?

我看到首席开发人员编写这样的代码并在阅读Mark Seemann的书“.NET中的dependency injection”时,我想知道特定的“新”是否是“外来的”,因此“Bastard Injection”? public class SessionInitServiceManager { protected readonly ICESTraceManager _traceManager; protected readonly ILogger _logger; protected readonly IAggregateCalls _aggregator; protected readonly IMultiCoreRepository _repository; public SessionInitServiceManager(ICESTraceManager traceManager, ILogger logger, IAggregateCalls aggregator, IMultiCoreRepository repository) { _traceManager = traceManager; _logger = logger; _aggregator = aggregator; _repository = repository; } public SessionInitServiceManager() : this(new CESTraceManager(), new Logger(“BusinessServices.authenticateUser”), new […]

DI / IoC,NHibernate并帮助他们一起工作

我正试图了解DI / IoC,NHibernate并让它们在我正在开发的应用程序中很好地协同工作。 我对NHibernate和DI / IoC都很陌生,所以不太确定我所做的是否是合理的方式。 这是场景: 该应用程序为用户提供了计算特定金融交易的特定值(称为保证金)的能力。 每个事务的marging值的计算是通过抽象MarginCalculator类的具体实现来执行的,并且要使用的具体实现取决于特定事务的产品类型(由产品对象的某个字段给出)。 通过产品类上的属性访问具体的计算器类。 即 public class Transaction { private double _margin; private Product _product; private Client _client; public double Margin { get; } public Product Product { get; } public Client Client { get; } public Transaction(Product p, Client c) { _product = p; _client = c; } […]

MEF =可能会遇到挫折感?

UPDATE 因为我试图在我的应用程序中使MEF工作,所以我遇到了更多的地方,我只是不明白为什么它不会在我期望的时候自动创建我的库。 我想这一切都回到了里德所说的关于需要MEF来创造一切的东西。 所以现在,我有一个XML阅读器类需要使用我的CandySettings,但即使它的ICandySettings属性具有[Import]属性,它也不会被导入。 首先我发现[导入]不适用于静力学,所以我改变了这一点。 但在那之后它仍然无效。 我认为这是因为我手动创建XML阅读器对象,而MEF要我做的是[导入] XML阅读器…这意味着我现在必须有一个接口。 这几乎就像使用IoC(或至少用于MEF),这是一个全有或全无的事情。 你不能随便随意使用它,因为最终你想要注入属性的类也需要由MEF创建。 如果我错了请纠正我! 原帖 嗯,这还不错。 :)但是在Reed指出MEF作为IoC的潜在替代品之后我确实有问题(到目前为止看起来确实很不错)。 请考虑以下模型: alt text http://bit.ly/9W0sHt 正如你所看到的,我有一个应用程序,这个应用程序使用插件(哎呀,错过了那个关联!)。 App和Plugins都需要使用CandySettings类型的对象,这可以在另一个程序集中找到。 我首先尝试在MEF中使用ComposeParts方法,但我能让它工作的唯一方法是在插件代码中执行类似的操作。 var container = new CompositionContainer(); container.ComposeParts(this, new CandySettings()); 但这没有任何意义,因为我为什么要在插件中创建CandySettings实例? 它应该在App中。 但是如果我把它放在App代码中,那么即使我在插件中使用[Import]和在CandySettings中使用[Export],插件也不会神奇地弄清楚如何获得ICandySettings。 编辑 (可能是因为我应该从应用程序调用ComposeParts()然后传递它的插件?) 我这样做的方法是使用MEF的DirectoryCatalog ,因为这允许插件在构造时扫描当前文件夹中的所有程序集并自动导入用[Import]属性标记的所有内容。 所以它看起来像这样,并且可能在每个插件中: var catalog = new DirectoryCatalog(“.”); var container = new CompositionContainer(catalog); container.ComposeParts(this); 这完全有效,但我不禁认为这不是MEF的用途吗?

Castle.Windsor生活方式取决于具体情况?

我有一个Web应用程序,其中许多组件使用.LifestylePerWebRequest()注册,现在我决定实现Quartz.NET ,一个.NET作业调度库,它在不同的线程中执行,而不是Request线程。 因此, HttpContext.Current产生null 。 到目前为止,我的服务,存储库和IDbConnection使用.LifestylePerWebRequest()实例化,因为它使得在请求结束时更容易处理它们。 现在我想在两种情况下使用这些组件,在Web请求期间我希望它们不受影响,在非请求上下文中我希望它们使用不同的生活方式,我想我可以自己处理处理,但我该怎么办关于它根据当前背景选择组件的生活方式? 目前我注册服务(例如),像这样: container.Register( AllTypes .FromAssemblyContaining() .Where(t => t.Name.EndsWith(“Service”)) .WithService.Select(IoC.SelectByInterfaceConvention) .LifestylePerWebRequest() ); 我想我应该使用某种扩展方法,但我只是看不到它..

IoC,Dll参考和汇编扫描

虽然这个问题与StructureMap有关,但我的一般问题是: 在代码中使用IoC容器连接组件时(而不是通过xml进行配置),您通常需要对所有程序集进行显式项目/构建引用吗? 为什么单独的组件? 因为: “与其具体实现相关的独立程序集中的抽象类是实现这种分离的好方法。” – 框架设计指南第91页 例: 假设我有PersonBase.dll和Bob.dll Bobinheritance自抽象类PersonBase 。 它们都在Person命名空间中。 但在不同的集会中 。 我正在为PersonBase编程,而不是Bob 。 回到我的主要代码中,我需要一个人。 StructureMap可以扫描assembly体。 好的,我会问一下StructureMap! 现在,在我的主要代码中,我当然只是指PersonBase ,而不是Bob 。 我实际上不希望我的代码知道鲍勃的 任何事情 。 没有项目参考,没有nuthin。 这就是重点。 所以我想说: //Reference: PersonBase.dll (only) using Person; … //this is as much as we’ll ever be specific about Bob: Scan( x=> { x.Assembly(“Bob.dll”); } //Ok, I should now have […]

惰性dependency injection

我有一个项目,其中Ninject用作IoC容器。 我担心的是很多类都有这样的构造函数: [Inject] public HomeController( UserManager userManager, RoleManager roleManager, BlahblahManager blahblahManager) { _userManager = userManager; _roleManager = roleManager; _blahblahManager = blahblahManager; } 如果我不想同时拥有这些类的所有实例怎么办? 当所有这些类被Lazy包装并传递给构造函数的方式并不是我所需要的。 尚未创建T实例,但Lazy实例已存储在内存中。 我的同事建议我使用Factory模式控制所有实例,但我不确定IoC是否有这么好的设计错误。 有没有针对这种情况的解决方法,或者IoC在其设计中确实存在如此大的缺陷? 也许我应该使用另一个IoC容器? 有什么建议?