将存储库实例注入 class
Injecting repository instance into class
我已经开始设计一个相当大的系统的各个部分,并且想知道使用存储库的最佳方式是什么。
哪种方法更好:
static void Main(string[] args)
{
var dataRepository = new DataRepository();
var classA = new ClassA(dataRepository);
classA.Save();
}
public interface IDataRepository
{
void Save(ClassA myInstance);
}
public class DataRepository : IDataRepository
{
public void Save(ClassA myInstance)
{
//Do some stuff
}
}
public class ClassA
{
private IDataRepository _dataRepository;
public ClassA(IDataRepository dataRepository)
{
_dataRepository = dataRepository;
}
public void Save()
{
_dataRepository.Save(this);
}
}
或者我应该这样做:
static void Main(string[] args)
{
var dataRepository = new DataRepository();
var classB = new ClassB();
dataRepository.Save(classB);
}
public interface IDataRepository
{
void Save(ClassB myInstance);
}
public class DataRepository : IDataRepository
{
public void Save(ClassB myInstance)
{
//Do some stuff
}
}
public class ClassB
{
//some stuff
}
或者有没有其他方法可以更优雅地做到这一点?
其实你的选择并没有好坏之分,而是有所不同。
- 1 是一个 active record pattern 实现。
- 2 更 DDDish (domain-driven design).
就我而言,由于 DDD 对我自己构建思维的方式很友好,所以我选择了 #2。通常这种方法更好(这是我的观点),因为它有利于更好地分离关注点和减少耦合:您的 POCO 类 与其存储库没有依赖关系,而 活动记录模式 的缺点是使您的 类 非常适合其用例(它们的可重用性较低)。
Or is there any other way I could this more elegantly?
这是一个非常宽泛的问题,我需要写一本书来给你一个可能和准确的答案。
顺便说一句,我认为您应该看一下 unit of work pattern,这将使您的解决方案更加强大,因为您将能够实施 与技术无关的域交易.
我已经开始设计一个相当大的系统的各个部分,并且想知道使用存储库的最佳方式是什么。
哪种方法更好:
static void Main(string[] args)
{
var dataRepository = new DataRepository();
var classA = new ClassA(dataRepository);
classA.Save();
}
public interface IDataRepository
{
void Save(ClassA myInstance);
}
public class DataRepository : IDataRepository
{
public void Save(ClassA myInstance)
{
//Do some stuff
}
}
public class ClassA
{
private IDataRepository _dataRepository;
public ClassA(IDataRepository dataRepository)
{
_dataRepository = dataRepository;
}
public void Save()
{
_dataRepository.Save(this);
}
}
或者我应该这样做:
static void Main(string[] args)
{
var dataRepository = new DataRepository();
var classB = new ClassB();
dataRepository.Save(classB);
}
public interface IDataRepository
{
void Save(ClassB myInstance);
}
public class DataRepository : IDataRepository
{
public void Save(ClassB myInstance)
{
//Do some stuff
}
}
public class ClassB
{
//some stuff
}
或者有没有其他方法可以更优雅地做到这一点?
其实你的选择并没有好坏之分,而是有所不同。
- 1 是一个 active record pattern 实现。
- 2 更 DDDish (domain-driven design).
就我而言,由于 DDD 对我自己构建思维的方式很友好,所以我选择了 #2。通常这种方法更好(这是我的观点),因为它有利于更好地分离关注点和减少耦合:您的 POCO 类 与其存储库没有依赖关系,而 活动记录模式 的缺点是使您的 类 非常适合其用例(它们的可重用性较低)。
Or is there any other way I could this more elegantly?
这是一个非常宽泛的问题,我需要写一本书来给你一个可能和准确的答案。
顺便说一句,我认为您应该看一下 unit of work pattern,这将使您的解决方案更加强大,因为您将能够实施 与技术无关的域交易.