标签: ioc-container

如何在ServiceStack.net中使用Funq注册多个IDbConnectionFactory实例

您将如何在Funq中注册不同的IDbConnectionFactory实例,然后直接在您的服务中访问它们?命名实例会以某种方式在这里发挥作用吗?

这是跨服务使用不同数据库时最好的方法吗?

谢谢!

编辑:

一个例子 ;).我可能会离开这里,因为我对IoC很新,但是比如说我有2个独立的数据库连接,我想注入.在ServiceStack中,这是在Global.asax中完成的.

container.Register<IDbConnectionFactory>(c =>
            new OrmLiteConnectionFactory(@"Connection String 1", SqlServerOrmLiteDialectProvider.Instance));                                             

container.Register<IDbConnectionFactory>(c =>
            new OrmLiteConnectionFactory(@"Connection String 2", SqlServerOrmLiteDialectProvider.Instance));                
Run Code Online (Sandbox Code Playgroud)

这两个似乎都注入了谦逊的海鲂.

然后通过以下方式在服务端自动访问它们:

public IDbConnectionFactory DbFactory { get; set; }
Run Code Online (Sandbox Code Playgroud)

在这种情况下,它似乎给了我第一个注册.如何访问服务端的特定访问权限?希望这会让它更加清晰.

这是ServiceStack.Examples的完整示例,仅使用1个IDbConnectionFactory: Movies Rest

c# ioc-container inversion-of-control servicestack funq

18
推荐指数
2
解决办法
7697
查看次数

依赖注入与策略模式

关于这个话题的讨论很多,但每个人似乎都错过了一个明显的答案.我想帮助审查这个"明显的"IOC容器解决方案.各种对话假设运行时选择策略和使用IOC容器.我将继续这些假设.

我还想补充一个假设,即它不是必须选择的单一策略.相反,我可能需要检索一个对象图,该对象图在整个图的节点中找到了几个策略.

我将首先快速概述两个常用的解决方案,然后我将展示我希望看到IOC容器支持的"明显"替代方案.我将使用Unity作为示例语法,但我的问题不是Unity特有的.

命名绑定

这种方法要求每个新策略都手动添加绑定:

Container.RegisterType<IDataAccess, DefaultAccessor>();
Container.RegisterType<IDataAccess, AlphaAccessor>("Alpha");
Container.RegisterType<IDataAccess, BetaAccessor>("Beta");
Run Code Online (Sandbox Code Playgroud)

......然后明确要求正确的策略:

var strategy = Container.Resolve<IDataAccess>("Alpha");
Run Code Online (Sandbox Code Playgroud)
  • 优点:简单,并得到所有IOC容器的支持
  • 缺点:
    • 通常将调用者绑定到IOC容器,当然要求调用者知道有关策略的信息(例如名称"Alpha").
    • 必须手动将每个新策略添加到绑定列表中.
    • 此方法不适合处理对象图中的多个策略.简而言之,它不符合要求.

抽象工厂

为了说明这种方法,假设以下类:

public class DataAccessFactory{
    public IDataAccess Create(string strategy){
        return //insert appropriate creation logic here.
    }
    public IDataAccess Create(){
        return //Choose strategy through ambient context, such as thread-local-storage.
    }
}
public class Consumer
{
    public Consumer(DataAccessFactory datafactory)
    {
        //variation #1. Not sufficient to meet requirements.
        var myDataStrategy = datafactory.Create("Alpha");
        //variation #2.  This is sufficient for requirements.
        var myDataStrategy = …
Run Code Online (Sandbox Code Playgroud)

.net c# dependency-injection ioc-container strategy-pattern

18
推荐指数
1
解决办法
6869
查看次数

使用ProjectTo()时,Mapper未初始化

我在我的项目中使用Automapper 5.2.0.当我ProjectTo()在代码中使用时获取此错误:

Mapper未初始化.使用适当的配置调用Initialize.如果您正试图通过容器或以其它方式使用映射器实例,请确保您不必静态Mapper.Map方法的任何电话,如果你使用ProjectTo或UseAsDataSource扩展方法,确保你在适当的IConfigurationProvider通实例.

服务代码

 public async Task<FreelancerProfileViewModel> GetFreelancerProfile()
    {
        var id = Guid.Parse(_identity.GetUserId());
        var model = await _freelancerProfiles
            .AsNoTracking()
            .Where(_ => _.User.Id == id)
            .ProjectTo<FreelancerProfileViewModel>()
            .FirstAsync();

     //  var viewmodel =  _mapper.Map<FreelancerProfileViewModel>(model);

        return model;
    }
Run Code Online (Sandbox Code Playgroud)

自动映射配置文件

   public class FreelancerDashbordProfile : Profile
{
    private readonly IIdentity _identity;
    public FreelancerDashbordProfile(IIdentity identity)
    {
        _identity = identity;
        var id = Guid.Parse(_identity.GetUserId());
        CreateMap<FreelancerProfile, FreelancerProfileViewModel>()
        .ForMember(_ => _.DoingProjectCount,
            __ => __.MapFrom(_ => _.Projects.Count(project => project.ProjectState == ProjectState.Doing)))

        .ForMember(_ => _.EndProjectCount,
            __ => __.MapFrom(_ …
Run Code Online (Sandbox Code Playgroud)

c# structuremap ioc-container automapper-5

18
推荐指数
2
解决办法
8226
查看次数

我们是否有效地使用IoC?

所以我的公司使用Castle Windsor IoC容器,但感觉"关闭":

  • 所有数据类型都在代码中注册,而不是在配置文件中注册.
  • 所有数据类型都是硬编码的,以使用一个接口实现.事实上,对于几乎所有给定的接口,只有一个实现.
  • 所有已注册的数据类型都具有默认构造函数,因此Windsor不会为任何已注册的类型实例化对象图.

设计系统的人坚持认为IoC容器使系统更好.我们有1200多个公共类,所以它是一个很大的系统,你期望找到像Windsor这样的框架.但我仍然持怀疑态度.

我的公司是否有效地使用IoC?使用Windsor的新对象比使用new关键字的新对象更有优势吗?

design-patterns castle-windsor ioc-container

17
推荐指数
1
解决办法
919
查看次数

删除IoC容器的依赖关系

在阅读了越来越多关于IoC容器的内容后,我读到了这篇文章,关于代码中没有IoC.Resolve()等.

我真的很想知道,我怎么能删除对容器的依赖?

我想写下面的代码:

public void Action()
{
    using(IDataContext dc = IoC.Resolve<IDataContext>())
    {
        IUserRepository repo = IoC.Resolve<IUserRepository>();
        // Do stuff with repo...
    }
}
Run Code Online (Sandbox Code Playgroud)

但是我如何摆脱IoC.Resolve调用呢?也许我需要更好地理解DI ......

提前致谢.

c# dependency-injection ioc-container inversion-of-control

17
推荐指数
1
解决办法
2341
查看次数

Simple Injector是否支持MVC 4 ASP.NET Web API?

我是Simple Injector IOC容器的新手.我将开始在一个项目中工作,该项目需要使用MVC 4 ASP.NET Web API的多租户ASP.NET MVC实现.

我的问题是:Simple injector支持MVC 4 ASP.NET Web API吗?喜欢读简单的注射器文档使得引用MVC 3,我想知道,如果MVC 4还支持.

.net c# ioc-container simple-injector

17
推荐指数
1
解决办法
6492
查看次数

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

我想知道为什么.Net IoC容器不能轻易支持单个接口的多个实现!可能是我错了,但就我所见,像Ninject这样的框架部分支持使用注释这个功能(如何?).我不认为像Windsor或简单注入器这样的其他框架有一个简单的机制来支持这种情况.

是否有任何理由不支持许多框架?AFAIK,使用接口的最重要原因之一是实现松散耦合.如果框架旨在改善松散耦合,不能流利地支持单个接口的多个实现,我不明白为什么!

PS当然我理解在运行时会出现解决问题,容器会混淆选择哪种实现,但这是设计中必须考虑的事情,对吧?

c# castle-windsor ioc-container inversion-of-control

17
推荐指数
4
解决办法
1万
查看次数

装饰者和IDisposable

我有一个子类 DbContext

public class MyContext : DbContext { }
Run Code Online (Sandbox Code Playgroud)

并且我对该实现有一个IUnitOfWork抽象MyContext,IDisposable以确保MyContext在适当的时间处理诸如的引用

public interface IUnitOfWork : IDisposable { }

public class UnitOfWork : IUnitOfWork 
{
    private readonly MyContext _context;

    public UnitOfWork()
    {
        _context = new MyContext();
    }

    ~UnitOfWork()
    {
        Dispose(false);
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    private bool _disposed;

    protected virtual void Dispose(bool disposing)
    {
        if (_disposed) return;

        if (disposing)
        {
            if (_context != null) _context.Dispose();
        }

        _disposed = true;
    }
} …
Run Code Online (Sandbox Code Playgroud)

c# decorator ioc-container simple-injector

17
推荐指数
2
解决办法
1594
查看次数

将Nininject MVC与类库一起使用

我对IoC框架很陌生,所以请原谅术语.

所以我所拥有的是一个带有Nininject MVC参考的MVC项目.我的项目中有其他类libarys,例如Domain层,我希望能够在那里使用Ninject框架,但我的所有绑定都在MVC项目NinjectWebCommon.csApp_Start文件夹下:

private static void RegisterServices(IKernel kernel)
{
    kernel.Bind<IHardwareService>().To<WindowsHardwareService>();
    kernel.Bind<IStatusApi>().To<StatusApiController>();
}
Run Code Online (Sandbox Code Playgroud)

目前在我的类库中我使用构造函数注入,但有时我不得不对依赖项进行硬编码:

var service = new WindowsHardwareService();
Run Code Online (Sandbox Code Playgroud)

当我希望能够做到以下几点时:

IKernel kernel = new StandardKernel(.....);
var context = kernel.Get<IHardwareService>();
Run Code Online (Sandbox Code Playgroud)

我没有做以下因为我没有任何模块?我读过的所有文档主要针对的是常规Ninject库而不是MVC版本.

我需要做什么,以及如何将常规Ninject库与MVC版本一起使用?

更新

这是我尝试过的:

这样做的目的是使每个项目都可以加载模块并获得当前注入的接口.

App_Start/NinjectWebCommon.cs(在MVC项目中)

private static void RegisterServices(IKernel kernel)
{
    var modules = new IoCModules();
    var newKernal = modules.GetKernel();

    kernel = newKernal;
}
Run Code Online (Sandbox Code Playgroud)

IoCModules.cs(在Project.Ioc项目中)

public class IoCModules
{
    public IKernel GetKernel()
    {
        var modules = new CoreModule();
        return modules.Kernel;
    }
}
Run Code Online (Sandbox Code Playgroud)

CoreModule.cs(在Project.IoC.Modules项目中)< - …

c# asp.net-mvc ninject ioc-container

17
推荐指数
1
解决办法
1040
查看次数

@PostConstruct注释和弹簧生命周期

我是Spring的新手,我想知道:

我有一个用@Component(spring)注释的java类,里面有一个用@PostConstruct注释的方法.然后,该类由另一个类中的@Autowired注释字段引用.我可以假设只在调用@PostConstruct后注入该类吗?

@Component
class AuthenticationMetrics {

  private static final MetricRegistry metrics = new MetricRegistry();

  final Counter requestsTotal

  final Meter guestLogins

  final Meter kfUserLogins

  final Timer guestLoginResponseTime

  final Timer kfLoginResponseTime

  @PostConstruct
  public void populateMetricsRegistry() {

    metrics.counter("authentication.requests.totals")

  }

}
Run Code Online (Sandbox Code Playgroud)

java spring ioc-container

17
推荐指数
3
解决办法
3万
查看次数