私は、これらのインタフェースを持っている:私はまた、抽象クラスと具象クラスを持っているインターフェイスからインスタンスを作成する方法は?
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);
}
、次のように使用: 'ICustomerService' タイプの
コンストラクタが見つかりません
var customerService = GetService<ICustomerService>();
ただし、次の例外がスローされます。
インターフェイスからクラスを正しくインスタンス化するにはどうすればよいですか?
あなたがインターフェイスからクラスのインスタンスを作成しないでください。インターフェイスを満たす*クラスインスタンスを作成します。しかし、明示的にクラスインスタンスを作成する必要があります(または、クラスをある種のIoCコンテナで登録する必要がありますが、それを早めに行う必要はありません)。あなたが大胆になっているようです。 –
あなたがしようとしているのは、_依存性注入を再現することだと思われます。それを見て、それはあなたが何かを自分で構築する必要はないことが分かります。 – oerkelens
あるいはmoqのような模擬フレームワークを再発明しています。 –