首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Ninject绑定未引用的DLL (如servicelocator/动态加载)?

如何使用Ninject绑定未引用的DLL (如servicelocator/动态加载)?
EN

Stack Overflow用户
提问于 2013-09-08 10:48:37
回答 1查看 670关注 0票数 0

我一直在测试尼尼特。

请有人解释如何将未引用的DLL绑定到某个接口。

这就是我所做的。

风格:服务定位器

实现MyRepository.dll的未引用DLL ( IMyRepository )

代码语言:javascript
复制
var MyRepo = ServiceLocator.Get<DomainInterfaces.IMyRepository>();
var WorOrderStates = MyRepo.FetchWorkOrderStates();

风格:依赖注入

实现IMyRepository的引用DLL (IMyRepository)

代码语言:javascript
复制
IMyRepository service = new CoreServices.MyService(new MyRepository());
var WorOrderStates = service.FetchWorkOrderStates();

现在。这两种风格完美的工作,我很高兴,但我不希望我的客户层知道我的DAL (MyRepository.dll)。

Ninject是否支持动态加载(服务定位器)功能?

比如:

代码语言:javascript
复制
var varMyRepository = load_Dynamically_and_get_its_Concrete_type
Kernel.Bind<IMyRepository>.To<>(varMyRepository);

===========================================================================================

从Se7en6ix更新

嗨,多亏了你,Vinz,你照亮了我。这是我根据你的好答案修改的版本。尽管与Activator.CreateInstance相比,加载程序集需要10‘s,但我认为它是可以接受的。

我现在所需要的只是检查一下是否有泄漏。谢谢

代码语言:javascript
复制
const string dll = "Gasket.Infrastructure.Data.dll";
var MyAssembly = Assembly.LoadFrom(dll).CreateInstance("Infrastructure.Data.Repository", true);
var MyAssemblyType = MyAssembly.GetType();
kernel.Bind<DomainInterfaces.IServiceRepository>().To(MyAssemblyType);
var repo = kernel.Get<DomainInterfaces.IServiceRepository>();
var states = repo.FetchGRStates(); //YESSSSS!
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-08 10:59:27

这可能不是您想要的解决方案,但是在Ninject执行之前,您可以自己加载程序集(使用Assembly.Load*()),这样它就可以遍历dll中的类型并找到IMyRepository的实现。客户端层仍然需要知道dll路径或文件名。

编辑:

我们必须手动找到实现类型,并使用ninject将其绑定到IDataRepository。这对我起了作用:

代码语言:javascript
复制
var assembly = Assembly.LoadFile(dllPath);

var dataRepositoryType = typeof(IDataRepository);
var types = assembly.GetTypes()
    .Where(dataRepositoryType.IsAssignableFrom).ToList();

// thow error if more than one implementing type

IKernel kernel = new StandardKernel();
kernel.Bind<IDataRepository>().To(types[0]);

var repo = kernel.Get<IDataRepository>();

希望这能有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18682822

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档