我一直在测试Ninject。
有人可以解释如何将未引用的DLL绑定到某个接口吗?
这是我所做的。
风格:服务定位器
未引用的DLL(MyRepository.dll),用于实现IMyRepository
var MyRepo = ServiceLocator.Get<DomainInterfaces.IMyRepository>();
var WorOrderStates = MyRepo.FetchWorkOrderStates();
风格:依赖注入
引用的DLL(MyRepository.dll),它实现了IMyRepository
IMyRepository service = new CoreServices.MyService(new MyRepository());
var WorOrderStates = service.FetchWorkOrderStates();
这两种样式都可以完美地工作,我对此感到高兴,但我不希望我的客户端层知道我的DAL(MyRepository.dll)。
Ninject是否支持动态加载(服务定位器)功能?
喜欢:
var varMyRepository = load_Dynamically_and_get_its_Concrete_type
Kernel.Bind<IMyRepository>.To<>(varMyRepository);
===================================================================================================================================================================================================================================================================================
从 Se7en6ix 更新
嗨,多亏了你 Vinz,你已经照亮了。 这是我根据您的好答案修改的版本。 虽然与 Activator.CreateInstance 相比,加载程序集需要 10 毫秒,但我认为这是可以接受的。
我现在需要的只是检查泄漏。谢谢
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!
这可能不是您要查找的解决方案,但是您可以在Ninject执行之前自己加载程序集(使用Assembly.Load*()),以便它可以遍历dll中的类型并找到IMyRepository的实现。客户端层仍然需要知道 dll 路径或文件名。
编辑:
我们必须手动找到实现类型并使用 ninject 将其绑定到 IDataRepository。这对我有用:
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>();
希望这有帮助。