2017-01-07 26 views
0

所有变化具有以下方面:而这个服务这是一个好的做法是通过一个EF的DbContext为代表的服务附加上

public class DemoContext : DbContext 
{ 
    private readonly string _connectionStringName = "DemoContext"; 
    public DemoContext() : base("name=DemoContext") 
    { 
     //_connectionStringName = "DemoContext"; 
     Configuration.ProxyCreationEnabled = false; 
     Configuration.LazyLoadingEnabled = false; 
     //Database.SetInitializer(new MigrateDatabaseToLatestVersion<DemoContext, Migrations.Configuration>(_connectionStringName)); 
     Database.SetInitializer(new NullDatabaseInitializer<DemoContext>()); 
    } 
    public DbSet<Employee> Employees { get; set; } 
    public DbSet<Company> Companies { get; set; } 
} 

public class Employee 
{ 
    [Key] 
    public int EmployeeId { get; set; } 
    public string Name { get; set; } 
    public DateTime DateOfBirth { get; set; } 
} 

public class Company 
{ 
    [Key] 
    public int CompanyId { get; set; } 
    public string CompanyName { get; set; } 
} 

public class EmployeeSvc 
{ 
    private readonly DemoContext _context; 

    public EmployeeSvc(Func<DemoContext> context) 
    { 
     _context = context(); 
    } 

    public void Add(EmployeeAgg employee) 
    { 
     _context.Employees.Attach(new Employee() 
     { 
      Name = employee.Name, 
      DateOfBirth = employee.DateOfBirth 
     }); 
    } 

    public void UpdateAll() 
    { 
     var employees = _context.Employees.ToList(); 
     foreach (var employee in employees) 
     { 
      employee.Name = $"{Guid.NewGuid()}"; 
     } 
    } 
} 

public class CompanySvc 
{ 
    private readonly DemoContext _context; 

    public CompanySvc(Func<DemoContext> context) 
    { 
     _context = context(); 
    } 
    public void Add(CompanyAgg company) 
    { 
     _context.Companies.Attach(new Company() 
     { 
      CompanyName = company.CompanyName 
     }); 
    } 

    public void UpdateAll() 
    { 
     var empresas = _context.Companies.ToList(); 
     foreach (var empresa in empresas) 
     { 
      empresa.CompanyName = $"{Guid.NewGuid()}"; 
     } 
    } 
} 

public class EmployeeAgg 
{ 
    public string Name { get; set; } 
    public DateTime DateOfBirth { get; set; } 
} 

public class CompanyAgg 
{ 
    public string CompanyName { get; set; } 
} 

ANF以下客户端代码:

static void Main(string[] args) 
    { 
     var context = new DemoContext(); 
     // ReSharper disable AccessToDisposedClosure 
     var employeeSvc = new EmployeeSvc(() => context); 
     var companySvc = new CompanySvc(() => context); 
     // ReSharper restore AccessToDisposedClosure 
     Console.WriteLine("Adding entities to context inside services"); 
     employeeSvc.Add(new EmployeeAgg() 
     { 
      DateOfBirth = DateTime.Now.AddYears(-10), 
      Name = $"Employee name" 
     }); 
     companySvc.Add(new CompanyAgg() 
     { 
      CompanyName = $"Company name" 
     }); 

     employeeSvc.UpdateAll(); 
     companySvc.UpdateAll(); 
     context.SaveChanges();    
     context.Dispose(); 
     Console.ReadLine(); 
    } 

它是一个很好的做法传递的DbContext以应用服务为代表,为了有一个参考到单个实例并跟踪其上的所有更改?

+1

是的,它被称为依赖注入。 – J11

回答

0

如果你需要注入你的dbContext,最好使用接口。 func <>不适用。 依赖注入接口是合适的。

+0

与EF的不一致之处在于,如果您创建一个接口或抽象类,则无法使用生成映射视图,因为它仅适用于从DbContext派生的类。我更喜欢仅将EF用作基础结构细节并创建域业务类。我不再做贫血域模型[这里](http://deviq.com/persistence-ignorance/) –

1

也许这是您的示例代码,但这里没有必要使用委托。你可能也仅仅接受DbContext并通过在同一个实例:

public class EmployeeSvc 
{ 
    private readonly DemoContext _context; 
    public EmployeeSvc(DemoContext context) 
    { 
     _context = context(); 
    } 
    // snip ... 
} 

public class CompanySvc 
{ 
    private readonly DemoContext _context; 
    public CompanySvc(DemoContext context) 
    { 
     _context = context(); 
    } 
    // snip ... 
} 


var context = new DemoContext(); 
var employeeSvc = new EmployeeSvc(context); 
var companySvc = new CompanySvc(context); 

这会给你完全相同的结果,而不需要在一个委托传递,并立即调用它。

但是我想可能你的实际代码有点复杂。如果是这样,你应该看看dependency injectionDI集装箱。

DI容器允许您管理您的依赖关系及其生命周期。常见的生命周期是生命周期,其中容器将始终构造在相同实例中传递的依赖关系。

+0

我做了这些测试的变化,它的工作,当我添加和实体与添加方法它的工作,但是当我用户附加的方法它没有工作。所以我需要检查方法以了解它们在不同场景下的行为。 –

相关问题