Tag: dependency injection

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; } […]

如何为ASP.NET MVC 5创建dependency injection?

使用ASP.NET Core创建dependency injection非常简单。 文档在这里解释得非常好,这个家伙有一个杀手video来解释它。 但是,我想对我的ASP.NET MVC 5项目做同样的事情。 如何处理ASP.MVC 5的dependency injection? 此外,dependency injection仅限于控制器,还是可以与任何类一起使用?

注册时是否可以指定多个Autofac生命周期范围?

我正在使用带有MVC4附加组件的Autofac IoC容器,该附加组件提供InstancePerHttpRequest生命周期范围。 但是在我的项目中,我有web,web-api和后台工作线程。 在下面的示例中,我假设InstancePerHttpRequest范围在不是源自Web请求时并不意味着什么。 builder.RegisterType().As() .InstancePerHttpRequest() 我想知道是否有可能做类似下面的例子并让容器选择最合适的生命周期范围? builder.RegisterType().As() .InstancePerHttpRequest() .InstancePerApiRequest() .InstancePerDependency(); 在这种情况下,我打算发生的是,如果请求来自Web请求,那么它将选择InstancePerHttpRequest范围,如果它来自webApi请求,它将选择InstancePerApiRequest范围,如果它被应用程序工作线程使用,它将使用InstancePerDependency范围? 任何想法,如果这或类似的东西是可能的? 谢谢

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:如何将所有接口实现注入ctor?

我编写了一个由多个类实现的接口。 我想写一个Service类,它将所有注册的实现注入到它的ctor中。 我能想到的唯一解决方案是在ctor中调用服务定位器并要求它解决()所有实现。 理想情况下,我想要这样的东西 – interface IVehicle { void Start(); } class Car : IVehicle { public void Start() { Console.WriteLine(“Car started.”); } } class Truck : IVehicle { public void Start() { Console.WriteLine(“Truck started.”); } } class Motorbike : IVehicle { public void Start() { Console.WriteLine(“Motorbike started.”); } } class VehicleService { // How […]

简单注射器中的工厂接口

我是Ninject用户,试图学习Simple Injector 我经常在我的应用程序中使用的一个Ninject feture是Factory Interface 有了它,我可以创建一个这样的接口: public interface IBarFactory { Bar CreateBar(); } 并注册就像这样 kernel.Bind().ToFactory(); 然后我简单可以使用IBarFactory,而不必创建IBarFactory的实现 我现在尝试在Simple njector中找到类似的东西,并找到了这个 。 但是随着那个接近,我必须实现工厂接口(更多代码)。 如果Bar对象需要引用另一个对象,该怎么办?

在ASP .Net Singleton注入类中使用DbContext

我需要在我的Startup类中实例化的Singleton类中访问我的数据库。 似乎直接注入它会导致处理掉的DbContext。 我收到以下错误: 无法访问已处置的对象。 对象名称:’MyDbContext’。 我的问题有两个:为什么这不起作用,如何在单例类实例中访问我的数据库? 这是我的Startup类中的ConfigureServices方法: public void ConfigureServices(IServiceCollection services) { // code removed for brevity services.AddEntityFramework().AddSqlServer().AddDbContext( options => { var config = Configuration[“Data:DefaultConnection:ConnectionString”]; options.UseSqlServer(config); }); // code removed for brevity services.AddSingleton(); } 这是我的控制器类: public class TestController : Controller { private FunClass _fun; public TestController(FunClass fun) { _fun = fun; } public List Index() […]

使用Unity在多个类型中注入相同的DataContext实例

假设我有IRepository接口及其实现SqlRepository,它将LINQ作为参数作为SQL DataContext的参数。 假设我有IService接口及其实现服务,它需要三个IRepository,IRepository和IRepository。 演示代码如下: public interface IRepository { } public class SqlRepository : IRepository { public SqlRepository(DataContext dc) { … } } public interface IService { } public class Service : IService { public Service(IRepository r1, IRepository, IRepository) { … } } 在创建Service类以使用相同的DataContext注入所有三个存储库时是否有任何方法?

MVC 5 IoC和身份validation

我即将开始一个项目,我将使用MVC5。 但是,由于我想使用IoC并稍后重用我的用户表,并向其添加自定义内容,我发现很难看到我如何使用MVC5附带的新Identity框架。 我越来越关注基本forms的认证。 你有什么解决方案? 我的需求: 必须注入用户存储库/服务 用户存储库必须驻留在DAL中 用户存储库必须能够支持除EF之外的其他技术 使用OpenID和OAuth进行身份validation必须要轻松实现 必须安全 应该可以在其他项目中重复使用,例如。 WPF 我一直在寻找答案,但我看到的一切都是在控制器中硬编码的。 你是怎么解决的? 您是从头开始编写的,还是可以绑定到可以扩展到其他.NET平台的东西,如WCF和WPF? 以下代码直接来自默认ASP.NET MVC 5模板中的AccountController。 它首先做的是Bastard Injection 。 [Authorize] public class AccountController : Controller { public AccountController() : this( new UserManager( new UserStore( new ApplicationDbContext()))) { } public AccountController(UserManager userManager) { UserManager = userManager; } } 接受的答案将交给那个人,它向我展示他们所做的事情,其中​​包含了上述要求

被动属性和嵌套容器

最终解决方案 在@ NightOwl888的答案的帮助下,这是我最后的方法,对于任何最终到此的人: 1)添加了全局filter提供程序: public class GlobalFilterProvider : IFilterProvider { public IEnumerable GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor) { var nestedContainer = StructuremapMvc.StructureMapDependencyScope.CurrentNestedContainer; foreach (var filter in nestedContainer.GetAllInstances()) { yield return new Filter(filter, FilterScope.Global, order: null); } foreach (var filter in nestedContainer.GetAllInstances()) { yield return new Filter(filter, FilterScope.Global, order: null); } foreach (var filter in nestedContainer.GetAllInstances()) { […]