0

我一直在测试 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!
4

1 回答 1

1

这可能不是您正在寻找的解决方案,但您可以在 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>();

希望这可以帮助。

于 2013-09-08T10:59:27.843 回答