【发布时间】:2012-09-12 20:31:03
【问题描述】:
假设我有这种情况:我有 2 个信息存储库,我想访问这两个存储库,但最好将决定使用哪个存储库的任务留给 通用类。
我们的目标是使用与我在下面编写的代码相似的东西来完成此任务,但这听起来很糟糕:
where TOnline : class
where TOffline : class
where TContract : class
当然我可以省略这一点,但基本上我要问的是如何才能停止使用反射并键入。也许有任何设计模式推荐?
代码(如果您将其复制/粘贴到替换 Program 类的控制台应用程序上,您应该能够运行该示例)
using CustomerDispatcher = DispatcherProxy<CustomerOnline, CustomerOffline, ICustomer>;
public interface ICustomer
{
string Get(int id);
}
public class CustomerOnline : ICustomer
{
public string Get(int id)
{
// Get From intranet DB
return "From DB";
}
}
public class CustomerOffline : ICustomer
{
public string Get(int id)
{
// Get From local storage
return "From local storage";
}
}
public class DispatcherProxy<TOnline, TOffline, TContract>
where TOnline : class
where TOffline : class
where TContract : class
{
public TContract Instance { get; set; }
public bool IsConnected { get; set; }
public DispatcherProxy()
{
// Asume that I check if it's connected or not
if (this.IsConnected)
this.Instance = (TContract)Activator.CreateInstance(typeof(TOnline));
else
this.Instance = (TContract)Activator.CreateInstance(typeof(TOffline));
}
}
class Program
{
static void Main(string[] args)
{
var customerDispatcher = new CustomerDispatcher();
Console.WriteLine("Result: " + customerDispatcher.Instance.Get(1));
Console.Read();
}
}
提前致谢!
【问题讨论】:
-
检查这个答案并使用 InjectionFactory stackoverflow.com/a/32272342/3760355
标签: c# design-patterns generics