Я пытаюсь отделить Bll от Dal, используя некоторые интерфейсы и шаблон Factory. Data.Contracts, содержащие интерфейсы, будут указаны в моем Bll.
Это небольшой тестовый код:
class Program
{
static void Main(string[] args)
{
IDataRepositoryFactory _DataRepositoryFactory;
IUserRepository userRepository = _DataRepositoryFactory.GetDataRepository<IUserRepository>();
}
}
public abstract class RepositoryBase<T> where T : class, new() { }
public class UserRepository : RepositoryBase<User>, IUserRepository
{
public UserRepository() { }
}
public class DataRepositoryFactory : IDataRepositoryFactory
{
public T GetDataRepository<T>() where T : IDataRepository, new()
{
return ObjectBase.Container.GetExportedValue<T>();
}
}
public class User
{
public int Id { get; set; }
}
public abstract class ObjectBase
{
public ObjectBase() { }
public static CompositionContainer Container { get; set; }
}
public interface IDataRepository { }
public interface IDataRepository<T> : IDataRepository where T : class, new() { }
public interface IUserRepository : IDataRepository { }
public interface IDataRepositoryFactory
{
T GetDataRepository<T>() where T : IDataRepository, new();
}
Наконец я получил свою ошибку:
«Data.Contracts.IUserRepository» должен быть неабстрактным типом с общедоступным конструктором без параметров, чтобы использовать его в качестве параметра «T» в универсальном типе или методе «Data.Contracts.IDataRepositoryFactory.GetDataRepository()»
Мой вопрос: какова правильная реализация для разделения кода на бизнес-уровне с использованием фабричного шаблона? Я не могу использовать конкретную реализацию UserRepository, поскольку она наследуется от классов, которые мне не нужны в BLL.
Любая помощь будет оценена по достоинству.