这是我在Stackoverflow中的第一篇文章。感谢Stackoverflow。
我的问题:
我在类库中有一个接口。
namespace TestClient
{
public interface IMobileStore
{
List<string> GetMobileDetails();
int AddMobile(string mobile);
}
}
我在另一个类库中有一个名为MobileLibrary的类,并实现了IMobileStore接口(开发时)
namespace MobileLibrary
{
public class MobileLibrary : IMobileStore
{
List<string> GetMobileDetails()
{
return new List<string>();
}
int AddMobile(string mobile)
{
return 1;
}
}
}
在控制台应用程序中使用MobileLibrary库并使用。
但是现在我想使用IndianMobileLibrary(它具有与下面相同的MobileLibrary类结构,但它没有实现接口)而不是MobileLibrary
注意:IndianMobileLibrary在另一个类库中可用(对此库没有任何控制 - 第三方库)
namespace IndianMobileLibrary
{
public class IndianMobileLibrary //(doesn't implement the interface)
{
List<string> GetMobileDetails()
{
return new List<string>();
}
int AddMobile(string mobile)
{
return 1;
}
}
}
这里是如何动态地将IMobileStore映射到IndianMobileLibrary(作为实现),并动态创建实现IndianMobileLibrary类的IMobileStore的对象。
正如我所听到的,企业库依赖注入将有助于此。但我仍然使用企业库。请你分享这个想法。
答案 0 :(得分:2)
你应该对伟大的impromptu interface库感兴趣(可通过nuget获得)。在它的帮助下,你可以简单地做一个魔术:
var indian = new IndianMobileLibrary();
IMobileStore iface = indian.ActLike<IMobileStore>();
var mobile = iface.AddMobile("test");
当然,您对ActLike
返回的对象有完整的智能感知支持。另一个神奇的优点是你根本不必知道indian
的类型。
答案 1 :(得分:1)
最简单的解决方案是以简单的“代理”时尚风格包装未实现接口的类,只需一个适配器:
public class MyIndianMobileLibrary:IMobileStore
{
public MyIndianMobileLibrary(IndianMobileLibrary indian){
_indianMobileLibrary = indian;
}
IndianMobileLibrary _indianMobileLibrary;
public List<string> GetMobileDetails()
{
return indian.GetMobileDetails();
}
public int AddMobile(string mobile)
{
return indian.AddMobile(mobile);
}
}
public class IndianMobileLibrary //(doesn't implement the interface)
{
public List<string> GetMobileDetails()
{
return new List<string>();
}
public int AddMobile(string mobile)
{
return 1;
}
}
修改强>
解决方案很简单但是,没有必要,也许这项工作:
public class MyIndianMobileLibrary:IndianMobileLibrary,IMobileStore
{
public MyIndianMobileLibrary(){
}
public List<string> GetMobileDetails()
{
return base.GetMobileDetails();
}
public int AddMobile(string mobile)
{
return base.AddMobile(mobile);
}
}
答案 2 :(得分:0)
最简单的方法是创建IndianMobileLibrary
功能的代理。您可以创建一个实现IMobileInterface
但使用IndianMobileLibrary
实现的代理类。
使用IndianMobileLibrary;
namespace MyIndianMobileLibrary
{
public class MyIndianMobileLibraryImpl : IMobileStore
{
List<string> GetMobileDetails()
{
return new IndianMobileLibrary.GetMobileDetails();
}
int AddMobile(string mobile)
{
return 1;
}
}
现在你有一个可编译的类来实现你的逻辑,并且可以在调用IMobileStore的任何地方注入。