public static void Main()
var service = new DataServiceAdapter<SpecificDisposableDataService>();
var client = new Client(service);
private readonly IDataService _service;
public Client(IDataService service)
public void ClientMethod()
Console.WriteLine(_service.Foo());
Console.WriteLine(_service.Bar("Hello"));
public class DataServiceAdapter<TService> : IDataService
where TService : IDataService, new()
private readonly TService _service;
private readonly Func<Func<TService, dynamic>, dynamic> _run;
public DataServiceAdapter()
if (typeof(IDisposable).IsAssignableFrom(typeof(TService)))
_service = new TService();
private dynamic RunWithUsing(Func<TService, dynamic> func)
using (var service = (IDisposable) new TService())
return func((TService)service);
private dynamic RunWithoutUsing(Func<TService, dynamic> func)
return _run(x => x.Foo());
public int Bar(string arg)
return _run(x => x.Bar(arg));
public class SpecificDisposableDataService : IDataService, IDisposable
public int Bar(string arg)
public class SpecificNotDisposableDataService : IDataService
public int Bar(string arg)
public interface IDataService