Diciamo che ho un codice semplice come questo ( fiddleLink ):
using System;
public class Program
{
public static void Main()
{
//Dependency register logic here
var service = new DataServiceAdapter();
var client = new Client(service);
Foo(client);
}
//Work class
public static void Foo(Client client)
{
client.ClientMethod();
}
}
public class Client
{
private readonly IDataService _service;
public Client(IDataService service)
{
_service = service;
}
public void ClientMethod()
{
Console.WriteLine(_service.Method());
Console.WriteLine(_service.Method2("Hello"));
}
}
internal class DataServiceAdapter : IDataService
{
public bool Method()
{
using (var something = new SpecifiDataService())
{
return something.Method();
}
}
public int Method2(string arg)
{
using (var something = new SpecifiDataService())
{
return something.Method2(arg);
}
}
}
public class SpecifiDataService : IDataService, IDisposable
{
public bool Method()
{
return true;
}
public int Method2(string arg)
{
return arg.Length;
}
public void Dispose()
{
//Dispose logic here
}
}
public interface IDataService
{
bool Method();
int Method2(string arg);
}
L'obiettivo che voglio raggiungere è incapsulare using
logic dal client da qualche altra parte (in particolare in DataServiceAdapter
class).
C'è un modo per scrivere l'istruzione using
solo una volta e non ripeterlo in ogni singolo metodo?
P.S. SpecifiDataService
può essere un servizio client WCF o DbContext di EntityFramework. Entrambi dovrebbero avere una vita breve, quindi non posso semplicemente aprire una connessione e lavorare con essa.
P.P.S Non riesco a riutilizzare SpecificDataService
perché in questo caso sarà l'implementazione WCF proxy-client o EntityFramework DbContext
. Entrambi i casi contengono dozzine di chiamate di metodo, quindi devo scrivere using
dichiarazioni ovunque. Prima di tutto voglio liberare la mia classe cliente dall'implementazione del servizio. Dovrebbe funzionare sia con servizi di breve durata che con soggiorni di lunga durata. Un'altra cosa che ho cercato di raggiungere - scrivere metodi senza using
perché la noiosa copia-incolla in ogni singolo metodo