将存储库实例注入 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    
}

或者有没有其他方法可以更优雅地做到这一点?

其实你的选择并没有好坏之分,而是有所不同。

就我而言,由于 DDD 对我自己构建思维的方式很友好,所以我选择了 #2。通常这种方法更好(这是我的观点),因为它有利于更好地分离关注点和减少耦合:您的 POCO 类 与其存储库没有依赖关系,而 活动记录模式 的缺点是使您的 类 非常适合其用例(它们的可重用性较低)。

Or is there any other way I could this more elegantly?

这是一个非常宽泛的问题,我需要写一本书来给你一个可能和准确的答案。

顺便说一句,我认为您应该看一下 unit of work pattern,这将使您的解决方案更加强大,因为您将能够实施 与技术无关的域交易.