J'ai récemment créé une solution et j'ai pensé que j'essaierais le conteneur DryIoC pour gérer l'injection de dépendances. Maintenant, comme avec beaucoup d'autres solutions DI que j'ai utilisées, la portée par défaut pour la réutilisation d'objet est transitoire. Cela semble toutefois poser un problème pour l'implémentation du modèle de référentiel que j'utilise depuis que DryIoC (et beaucoup d'autres solutions) ne peuvent pas enregistrer une liaison en tant que transitoire si la classe référencée implémente IDisposable. Par conséquent, j'ai temporairement recouru à l'enregistrement de mes dépôts avec Reuse.Singleton. Ceci est certainement une odeur de code pour moi, alors j'espérais que quelqu'un pourrait avoir des conseils sur la façon d'éviter cette situation - il se peut que je fasse un piètre travail de création d'un dépôt par exemple.Évitez le dépôt singleton (DryIoc) lorsque vous utilisez l'injection de dépendance
Voici le code que j'utilise pour créer le conteneur IoC:
private static Container ConstructNewContainer()
{
var container = new Container(Rules.Default);
container.Register(Made.Of(() => SettingsFactory.CreateSettings()));
container.Register<IRepository<tblMailMessage>, MailMessageRepository>(Reuse.Singleton);
container.Register<IRepository<ProcessedMailMessages>, ProcessedMailMessageRepository>(Reuse.Singleton);
container.Register<IParser, EmailParser>();
container.Register<IMonitor, DatabaseMonitor>();
return container;
}
... et une mise en œuvre du référentiel exemple:
public interface IRepository<T>
{
void Insert(T objectToInsert);
void Delete(int id);
void Update(T objectToUpdate);
void Save();
T GetById(long id);
IEnumerable<T> Get();
T Last();
bool Exists(int id);
}
public class MailMessageRepository : IRepository<tblMailMessage>, IDisposable
{
private bool _disposed;
private readonly CoreDataModel _model;
public MailMessageRepository()
{
_model = new CoreDataModel();
}
public void Delete(int id)
{
var objectToDelete = _model.tblMailMessages.Find(id);
if (objectToDelete != null) _model.tblMailMessages.Remove(objectToDelete);
}
public void Update(tblMailMessage objectToUpdate) => _model.Entry(objectToUpdate).State = EntityState.Modified;
public void Save() => _model.SaveChanges();
public IEnumerable<tblMailMessage> Get() => _model.tblMailMessages.ToList();
public tblMailMessage Last() => _model.tblMailMessages.OrderByDescending(x => x.DateSubmitted).FirstOrDefault();
public bool Exists(int id) => _model.tblMailMessages.SingleOrDefault(x => x.MailMessageID == id) != null;
public void Insert(tblMailMessage objectToInsert) => _model.tblMailMessages.Add(objectToInsert);
public tblMailMessage GetById(long id) => _model.tblMailMessages.SingleOrDefault(x => x.MailMessageID == id);
#region Dispose
protected virtual void Dispose(bool disposing)
{
if (!_disposed)
{
if (!disposing)
{
_model.Dispose();
}
}
_disposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
#endregion
}
Merci beaucoup pour l'information! Pourriez-vous fournir quelques exemples de contenants d'ID qui peuvent répondre à ce besoin? La raison pour laquelle j'ai utilisé DryIoC est parce qu'il a une grande performance et répond à mes exigences fonctionnelles. – spuriousGeek
Il existe une liste de conteneurs .NET [ici] (https://github.com/danielpalme/IocPerformance), mais notez que les performances sont rarement le meilleur indicateur du conteneur à utiliser. La plupart ont des caractéristiques similaires, il s'agit simplement d'en trouver un qui est toujours activement pris en charge et qui répond à vos besoins. – NightOwl888