3

長時間監聽器,第一次調用者。MVC 4後期綁定的DataContext實體LINQ參考

我可能採取了錯誤的做法,所以任何幫助將是太棒了。

我正在使用C#,MVC 4,Code First,Entity Framework 4.3,& Razor。

我想分割EF數據類&一些方法到一個單獨的類項目,以便他們一般可以由多個其他項目引用。我已經創建了這個簡化的示例,以儘可能地突出問題。

因此,在一類項目,我有:

public MyGeneric(string name) 
{ 
    ID = Guid.NewGuid(); 
    Name = name; 
} 

public Guid ID { get; set; } 
public string Name { get; set; } 


public void AddThis(MyGeneric obj) 
{ 
    using (var db = Activator.CreateInstance<myDbContext>()) 
    { 
     var myOthers = from mo in db.MyOther 
         where mo.OtherID == obj.ID 
         select mo; 

     myOthers.ForEach(mo => db.MyOther.Add(mo)); 
     db.SaveChanges(); 
    } 
} 

,然後我可以如在主項目中引用這樣的:

public class SampleInherit : MyGeneric 
{ 
    public SampleInherit(string newName, string secName) 
     : base(newName) 
    { 
     SecName = secName; 
    } 

    public string SecName { get; set; } 


    public void DoSomething(SampleInherit obj) 
    { 
     base.AddThis(obj); 
     // do other stuff 
    } 
} 

我試圖做的是genericise(被一個詞?)幾個類與他們的方法到一個單獨的側項目。此方項目將提供基類,將(以期望的順序):

  • 使用EF的DbContext創建/訪問數據庫,
  • 允許添加更多的屬性,
  • 供給方法/程序,影響底層數據,
  • 對於主項目更適合重新命名。

現在,如果我只是繼承了主體工程的基類爲類,它除了基類引用的所有作品myDbContext &的LINQ語句中的實體對象的引用。

你可以後期綁定DataContext還是讓我自己進入角落?

歡呼你所能提供的所有幫助。

回答

0

我認爲你要做的是實現IRepository模式。基本上你想要做的是創建一個包含你的實體和你的IRepository的類項目。從那裏你通過創建你的Repository類來創建IRepository的具體實現。您可以使用業務邏輯層通過IRepository訪問存儲庫。並在那裏做你的數據訪問。

public interface IRepository<T> 
{ 
    IQueryable<T> Fetch(); 

    bool Insert(T entity); 

    bool Update(T entity); 
} 

然後創建你的倉庫

public class MyRepository<TContext> : IRepository<EntityType> where TContext: DbContext, new() 
{ 
    private TContext context; 

    public MyRepository(TContext context) 
    { 
     this.context = context; 
    } 

    public IQueryable<T> Fetch() 
    { 
     return context.EntityTypes; 
    } 

    // Insert and update logic 
} 

最後創建業務邏輯

public class BusinessLogic 
{ 
    private IRepository<EntityType> repository; 

    public BusinessLogic(IRepository<EntityType> repository) 
    { 
     this.repository = repository; 
    } 

    public void Add(EntityType obj) 
    { 
     bool isNew = // check if new 
     if(isNew) 
     { 
     this.repository.Insert (obj)  
     } 
     else 
     { 
     this.repository.Update(obj); 
     } 
    } 
} 

然後調用你的業務邏輯

IRepository<EntityType> repository = new MyRepository<MyDbContext>(new MyDbContext()); 
BusinessLogic service = new BusinessLogic(repository); 

service.Add(new EntityType()); 

我不認爲你想晚期結合數據上下文,爲了性能考慮,最好使用泛型(就像上面的例子一樣)。此外,通過這種方法,您可以實例化數據上下文並將其傳遞給業務服務,以便實體框架可以跟蹤實體,而不是爲每次調用AddThis實例化新的數據上下文。再加上這種模式,你可以做各種各樣的很酷的事情,比如使用像ninject這樣的IOC容器來爲你創建這些業務服務,並且使用Mocks爲你的代碼創建單元測試,而不必擊中數據庫(通過模擬你的倉庫)。

+0

不,我不是指存儲庫。我想用Code First來創建數據庫。遲綁定可能不是使用的正確術語。我想繼承數據庫創建能力。 – PhantomRick 2012-10-11 07:25:07