假设我有2个接口的子类,
public interface ITradable {
T GetTradeManager<T>(ManagerLocation location) where T: ITradeManager
}
public interface ISpendable : ITradable {}
public interface ILoanable : ITradable {}
ITradeManager
有两个子接口:ISpendManager
和ILoanManager
。
现在,当动态处理实现ITradable
的对象时,我需要根据正在使用的派生类来检索适当的管理器。我设计的潜在问题似乎是我可能会尝试从ILoanManager
实施中检索ISpendable
。例如:
ISpendable spendable = //get
ILoanManager manager = spendable.GetTradeManager<LoanManager>(location)
现在,此特定交易可能使用不是TradeManager
的{{1}}。但是,也可能是交易可以贷款或花费,所以我需要能够在许多情况下指定。
我认为这是糟糕的设计我错了吗?有没有更好的方法呢?我基本上希望ITradable尽可能通用,但也强制要求ISpendables只返回ISpendManagers,而ILoanables只返回ILoanManagers。
答案 0 :(得分:0)
有一点是你需要为服务和经理提供一些通用的命名约定。
在您的基本服务GetTrademanager
方法中,只要请求Manager,请确保它与当前服务的起始名称匹配。
using System;
using System.Collections.Generic;
namespace ConsoleApplication6
{
class Program
{
static void Main(string[] args)
{
var child1Service = new Child1Service();
var child2Service = new Child2Service();
var child1Manager = child1Service.GetTradeManager<IChild1Manager>();
var child2Manager = child2Service.GetTradeManager<IChild2Manager>();
var child1NewManager = child1Service.GetTradeManager<IChild2Manager>();
}
}
public abstract class ParentService
{
public T GetTradeManager<T>() where T : IBaseManager
{
Type instanceType = null;
GenericHelper.DependencyDictionary.TryGetValue(typeof(T),out instanceType);
if (instanceType == null)
throw new NotImplementedException("Type Not Implemented");
if (!this.GetType().Name.Replace("Service", "").StartsWith(instanceType.Name.Replace("Manager", "")))
throw new InvalidOperationException("Not Same Manager");
return (T)Activator.CreateInstance(instanceType);
}
}
public class Child1Service : ParentService { }
public class Child2Service : ParentService { }
public abstract class BaseManager : IBaseManager
{
}
public interface IBaseManager
{
}
public interface IChild1Manager : IBaseManager { }
public class Child1Manager : BaseManager, IChild1Manager { }
public interface IChild2Manager : IBaseManager { }
public class Child2Manager : BaseManager, IChild2Manager { }
public static class GenericHelper
{
public static Dictionary<Type, Type> DependencyDictionary { get; set; } = new Dictionary<Type, Type>() { { typeof(IChild1Manager), typeof(Child1Manager) }, { typeof(IChild2Manager), typeof(Child2Manager) } };
}
}
当你试图获得另一种类型的经理时,它会抛出一个错误。