【发布时间】:2017-12-14 09:13:30
【问题描述】:
我有这些接口:
public interface _IService<T>
{
T Get(int id);
Task<T> SaveAsync(T entity);
Task<bool> DeleteAsync(int id);
}
public interface ICustomerService :
IService<Customer>
{
IEnumerable<Customer> GetMany(IEnumerable<int> ids);
}
我还有一个抽象类和一个具体类:
public abstract class Service : IDisposable
{
protected readonly IUnitOfWork unitOfWork;
protected Service(IUnitOfWork unitOfWork)
{
this.unitOfWork = unitOfWork;
}
public void Dispose()
{
if (unitOfWork != null)
{
unitOfWork.Dispose();
}
}
}
public class CustomerService : Service, ICustomerService
{
public CustomerService(IUnitOfWork unitOfWork)
: base(unitOfWork)
{ }
//Implementation here...
}
一切都按预期进行。
现在我想添加通用工厂模式来实例化各种服务。所以我尝试这样做:
public TService GetService<TService>()
{
object[] args = new object[] { (unitOfWork) };
return (TService)Activator.CreateInstance(typeof(TService), args);
}
并按如下方式使用:
var customerService = GetService<ICustomerService>();
但是,会抛出以下异常:
找不到类型“ICustomerService”的构造函数。
那么我怎样才能正确地从接口实例化一个类呢?
【问题讨论】:
-
您不会从接口创建类实例。您创建一个类实例来满足接口。但是您仍然需要显式创建类实例(或使用某种 IoC 容器注册该类 - 但不要过早地这样做)。看起来很像你过度工程。
-
看来你要做的是重新发明依赖注入。查一下,很可能你不需要自己构建任何东西。
-
或者你正在重新发明像 moq 这样的模拟框架。
-
如果你只是改变'var customerService = GetService
();'到 'var customerService = GetService ();'? -
@Mirt 虽然这行得通,但我认为这不是 OP 的目的:)
标签: c#