您将如何在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
关于这个话题的讨论很多,但每个人似乎都错过了一个明显的答案.我想帮助审查这个"明显的"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)
为了说明这种方法,假设以下类:
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) 我在我的项目中使用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) 所以我的公司使用Castle Windsor IoC容器,但感觉"关闭":
设计系统的人坚持认为IoC容器使系统更好.我们有1200多个公共类,所以它是一个很大的系统,你期望找到像Windsor这样的框架.但我仍然持怀疑态度.
我的公司是否有效地使用IoC?使用Windsor的新对象比使用new
关键字的新对象更有优势吗?
在阅读了越来越多关于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 ......
提前致谢.
我是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 IoC容器不能轻易支持单个接口的多个实现!可能是我错了,但就我所见,像Ninject这样的框架部分支持使用注释这个功能(如何?).我不认为像Windsor或简单注入器这样的其他框架有一个简单的机制来支持这种情况.
是否有任何理由不支持许多框架?AFAIK,使用接口的最重要原因之一是实现松散耦合.如果框架旨在改善松散耦合,不能流利地支持单个接口的多个实现,我不明白为什么!
PS当然我理解在运行时会出现解决问题,容器会混淆选择哪种实现,但这是设计中必须考虑的事情,对吧?
我有一个子类 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) 我对IoC框架很陌生,所以请原谅术语.
所以我所拥有的是一个带有Nininject MVC参考的MVC项目.我的项目中有其他类libarys,例如Domain层,我希望能够在那里使用Ninject框架,但我的所有绑定都在MVC项目NinjectWebCommon.cs
的App_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项目中)< - …
我是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) ioc-container ×10
c# ×8
.net ×2
asp.net-mvc ×1
automapper-5 ×1
decorator ×1
funq ×1
java ×1
ninject ×1
servicestack ×1
spring ×1
structuremap ×1