Does Queryability and Lazy Loading in C# blur the lines of Data Access vs Business Logic?

I am experiencing a mid-career philosophical architectural crisis. I see the very clear lines between what is considered client code (UI, Web Services, MVC, MVP, etc) and the Service Layer. The lines from the Service layer back, though, are getting more blurred by the minute. And it all started with the ability to query code with Linq and the concept of Lazy loading.

I have created a Business Layer that consists of Contracts and Implementations. The Implementations then could have dependencies to other Contracts and so on. This is handled via an IoC Container with DI. There is one service that handles the DataAccess and all it does is return a UnitOfWork. This UnitOfWork creates a transaction when extantiated and commits the data on the Commit method. [View this Article (Testability and Entity Framework 4.0)]:

    public interface IUnitOfWork : IDisposable {
        IRepository<T> GetRepository<T>() where T : class;
        void Commit();

The Repository is generic and works against two implementations (EF4 and an in-memory DataStore). T is made up of POCOs that get generated from the database schema or some EF4 object mapped from multiple DB objects. Testability is built into the Repository design. We can leverage the in-memory implementation to assert results with expectations since we are abstracting the data access query generator.

    public interface IRepository<T> where T : class {
        IQueryable<T> Table { get; }
        void Add(T entity);
        void Remove(T entity);

While the data source is abstracted, IQueryable still gives me the ability to create queries anywhere I want within the business logic layer. Here is an example.

    public interface IFoo {
        Bar[] GetAll();

    public class FooImpl : IFoo {
        IDataAccess _dataAccess;
        public FooImpl(IDataAccess dataAccess) {
            _dataAccess = dataAccess;

        public Bar[] GetAll() {
            Bar[] output;
            using (var work = _dataAccess.DoWork()) {
                output = work.GetRepository<Bar>().Table.Where(b => b.IsActive == true).ToArray();
            return output;

Now you can see how the queries could get even more complex as you perform joins with complex filters.

Therefore, my questions is:

  1. Is queryability considered data access or business logic when behind a repository layer that acts like an in-memory abstraction?

This article was originally a question posted on StackOverflow.


The iPhone is a big waste of time

I just got an iPhone and I have to admit that it is a great devise for business purposes. But in the hands of a teenager, or someone that has never grown up, I can see how it could be the biggest waste of time.

I will try not to fall into the deep abyss that could be the iPhone.

Red Gate’s SQL Source Control

I have been looking for a product like this for years and it is almost here. I am talking about an integrated source control IDE for SQL Server. Check out the following link and the details below:

SQL Source Control

Store your SQL Server databases under source control

  • Source control your database
  • Work directly in Management Studio, not with offline scripts
  • Connect your database to your existing source control system
  • Know who changed what, when, and why
  • Help the whole team stay in sync by easily getting the latest database version

There will be frequent early access releases as we develop SQL Source Control

  • The first early access release will support only Subversion
  • The next early access release will support Team Foundation Server
  • They’ll release version 1 in 2010
  • Sign up for the early access program and they’ll keep you updated

Work, Vacation and back to Work

Work just seems to follow me everywhere, including on my vacations. It has been extremely hectic here at BravePoint for the past 4 months. Trying to get a product out the door and it just seems like we are moving through mud. It has been a combination of distractions and lack of momentum, but hopefully we can get back on track.

Here is a list of technologies we have been working on:

  • SmartClient 7.0 RC (RIA framework)
  • ExtJS 2.0
  • BIRT & Java
  • ASP.NET MVC 1.0
  • An in-house Webspeed RPC Engine

I have been learning none stop and hopefully it will attract more clients as we start gaining more and more experience in these different areas.  I will try to get a little more technical on my subsiquent post.  I know that I always say that but, like I said, I have just been too busy.

I have finally made the switch to DreamHost

I have abeen with godaddy for the better part of decade and now I am dreaming with DreamHost. The ease of their hosting panel. The price is respectable, especially since I took advantage of the 777 coupon that they published on their splash page (one year hosting for less than $10). They give you unlimited space and traffic.

I was able to transfer my wordpress blog in a matter of minutes. The databases setups are almost instantaneous. And the ssh access is fantastic. They give you close to full rights under your home directory.

I also setup a couple of subversion repositories and installed redmine as my project management site. And this is coming from a complete newbie to the linux world. I have been a windows guy thru and thru, up to about a month ago. To be honest, the speed and ease of setup of a lamps web site trumps all else.

DreamHost also gives you the ability to host multiple sites with different webapps from the same account. I am completely sold. I only hope that the early success I have had with this hosting provider lasts more than a couple of weeks.


Posting to my WordPress blog using MS Word

This is a test of me posting to my blog using MS Word and the MetaWeblog XML-RPC engine. This will help me blog more often than I have in the past.

I will try to be a little more fruitful in the future with more technically oriented posts.

Dynamically loading javascript files

Below is a little piece of code that helped us facilitate dynamically loading javascript files.

// Please go here for details on the script below:
var head = document.getElementsByTagName("head")[0];
var script = document.createElement('script');
script.setAttribute("id", id);
script.setAttribute("type", 'text/javascript');
script.setAttribute("src", url);
script.onload = function(){
   loadedCallback(sender, id);
script.onreadystatechange = function(){
   if (this.readyState == 'loaded' || this.readyState == 'complete') {
      loadedCallback(sender, id);

As you can see the same callback loadedCallback(sender, id); is called twice. The first under the load function is only picked up by Firefox, Opera, etc. and the onreadystatechange is a Microsoft event. Took me forever to figure the Microsoft solution.